@@ -576,6 +576,201 @@ const VALID_FORM_SIGNATURES: [[bool; 10]; 13] = [
576576] ;
577577
578578impl 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