blob: 7fbea6809e9acc1dae4c635d012dbb99708c2172 [file] [log] [blame]
// 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)
}
}