Skip to content

Commit b2c6718

Browse files
authored
Add Schema::into_serde_schema (#15)
* Add Schema::into_serde_schema * Prepare release 0.3.1
1 parent bac1e6b commit b2c6718

File tree

2 files changed

+196
-1
lines changed

2 files changed

+196
-1
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "jtd"
3-
version = "0.3.0"
3+
version = "0.3.1"
44
description = "A Rust implementation of JSON Type Definition"
55
authors = ["JSON Type Definition Contributors"]
66
edition = "2018"

src/schema.rs

+195
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,201 @@ const VALID_FORM_SIGNATURES: [[bool; 10]; 13] = [
576576
];
577577

578578
impl Schema {
579+
/// Converts a [`Schema`] into a [`SerdeSchema`].
580+
///
581+
/// ```
582+
/// use jtd::{Schema, SerdeSchema, Type};
583+
///
584+
/// assert_eq!(
585+
/// SerdeSchema {
586+
/// type_: Some("uint8".to_owned()),
587+
/// ..Default::default()
588+
/// },
589+
/// Schema::Type {
590+
/// definitions: Default::default(),
591+
/// metadata: Default::default(),
592+
/// nullable: false,
593+
/// type_: Type::Uint8,
594+
/// }.into_serde_schema(),
595+
/// );
596+
/// ```
597+
pub fn into_serde_schema(self) -> SerdeSchema {
598+
let mut serde_schema: SerdeSchema = Default::default();
599+
600+
match self {
601+
Schema::Empty {
602+
definitions,
603+
metadata,
604+
} => {
605+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
606+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
607+
}
608+
609+
Schema::Ref {
610+
definitions,
611+
metadata,
612+
nullable,
613+
ref_,
614+
} => {
615+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
616+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
617+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
618+
serde_schema.ref_ = Some(ref_);
619+
}
620+
621+
Schema::Type {
622+
definitions,
623+
metadata,
624+
nullable,
625+
type_,
626+
} => {
627+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
628+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
629+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
630+
serde_schema.type_ = Some(
631+
match type_ {
632+
Type::Boolean => "boolean",
633+
Type::Int8 => "int8",
634+
Type::Uint8 => "uint8",
635+
Type::Int16 => "int16",
636+
Type::Uint16 => "uint16",
637+
Type::Int32 => "int32",
638+
Type::Uint32 => "uint32",
639+
Type::Float32 => "float32",
640+
Type::Float64 => "float64",
641+
Type::String => "string",
642+
Type::Timestamp => "timestamp",
643+
}
644+
.to_owned(),
645+
);
646+
}
647+
648+
Schema::Enum {
649+
definitions,
650+
metadata,
651+
nullable,
652+
enum_,
653+
} => {
654+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
655+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
656+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
657+
serde_schema.enum_ = Some(enum_.into_iter().collect());
658+
}
659+
660+
Schema::Elements {
661+
definitions,
662+
metadata,
663+
nullable,
664+
elements,
665+
} => {
666+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
667+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
668+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
669+
serde_schema.elements = Some(Box::new(elements.into_serde_schema()));
670+
}
671+
672+
Schema::Properties {
673+
definitions,
674+
metadata,
675+
nullable,
676+
properties,
677+
optional_properties,
678+
properties_is_present,
679+
additional_properties,
680+
} => {
681+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
682+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
683+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
684+
685+
if properties_is_present {
686+
serde_schema.properties = Some(
687+
properties
688+
.into_iter()
689+
.map(|(k, v)| (k, v.into_serde_schema()))
690+
.collect(),
691+
);
692+
}
693+
694+
if !optional_properties.is_empty() {
695+
serde_schema.optional_properties = Some(
696+
optional_properties
697+
.into_iter()
698+
.map(|(k, v)| (k, v.into_serde_schema()))
699+
.collect(),
700+
);
701+
}
702+
703+
if additional_properties {
704+
serde_schema.additional_properties = Some(additional_properties);
705+
}
706+
}
707+
708+
Schema::Values {
709+
definitions,
710+
metadata,
711+
nullable,
712+
values,
713+
} => {
714+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
715+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
716+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
717+
serde_schema.values = Some(Box::new(values.into_serde_schema()));
718+
}
719+
720+
Schema::Discriminator {
721+
definitions,
722+
metadata,
723+
nullable,
724+
discriminator,
725+
mapping,
726+
} => {
727+
serde_schema.definitions = Self::definitions_into_serde_schema(definitions);
728+
serde_schema.metadata = Self::metadata_into_serde_schema(metadata);
729+
serde_schema.nullable = Self::nullable_into_serde_schema(nullable);
730+
serde_schema.discriminator = Some(discriminator);
731+
serde_schema.mapping = Some(
732+
mapping
733+
.into_iter()
734+
.map(|(k, v)| (k, v.into_serde_schema()))
735+
.collect(),
736+
);
737+
}
738+
}
739+
740+
serde_schema
741+
}
742+
743+
fn definitions_into_serde_schema(
744+
definitions: Definitions,
745+
) -> Option<BTreeMap<String, SerdeSchema>> {
746+
if definitions.is_empty() {
747+
None
748+
} else {
749+
Some(
750+
definitions
751+
.into_iter()
752+
.map(|(k, v)| (k, v.into_serde_schema()))
753+
.collect(),
754+
)
755+
}
756+
}
757+
758+
fn metadata_into_serde_schema(metadata: Metadata) -> Option<BTreeMap<String, Value>> {
759+
if metadata.is_empty() {
760+
None
761+
} else {
762+
Some(metadata)
763+
}
764+
}
765+
766+
fn nullable_into_serde_schema(nullable: bool) -> Option<bool> {
767+
if nullable {
768+
Some(true)
769+
} else {
770+
None
771+
}
772+
}
773+
579774
/// Constructs a [`Schema`] from a [`SerdeSchema`].
580775
///
581776
/// ```

0 commit comments

Comments
 (0)