// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use crate::child_name::ChildName;
use crate::moniker::Moniker;
use schemars::gen::SchemaGenerator;
use schemars::schema::Schema;
use schemars::{schema_for, JsonSchema};
use serde::de::{self, Deserializer, Visitor};
use serde::{Deserialize, Serialize, Serializer};
use std::fmt;

impl Serialize for ChildName {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        serializer.collect_str(&self)
    }
}

struct ChildNameVisitor;

impl<'de> Visitor<'de> for ChildNameVisitor {
    type Value = ChildName;

    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        formatter.write_str("a child moniker of a component instance")
    }

    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
    where
        E: de::Error,
    {
        match ChildName::parse(value) {
            Ok(moniker) => Ok(moniker),
            Err(err) => Err(E::custom(format!("Failed to parse ChildName: {}", err))),
        }
    }
}

impl<'de> Deserialize<'de> for ChildName {
    fn deserialize<D>(deserializer: D) -> Result<ChildName, D::Error>
    where
        D: Deserializer<'de>,
    {
        deserializer.deserialize_str(ChildNameVisitor)
    }
}

impl Serialize for Moniker {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        serializer.collect_str(&self)
    }
}

struct MonikerVisitor;

impl<'de> Visitor<'de> for MonikerVisitor {
    type Value = Moniker;

    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        formatter.write_str("a moniker of a component instance")
    }

    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
    where
        E: de::Error,
    {
        match Moniker::parse_str(value) {
            Ok(moniker) => Ok(moniker),
            Err(err) => Err(E::custom(format!("Failed to parse Moniker: {}", err))),
        }
    }
}

impl<'de> Deserialize<'de> for Moniker {
    fn deserialize<D>(deserializer: D) -> Result<Moniker, D::Error>
    where
        D: Deserializer<'de>,
    {
        deserializer.deserialize_str(MonikerVisitor)
    }
}

impl JsonSchema for Moniker {
    fn schema_name() -> String {
        "Moniker".to_owned()
    }
    fn json_schema(_gen: &mut SchemaGenerator) -> Schema {
        Schema::Object(schema_for!(String).schema)
    }
}
