@@ -576,6 +576,201 @@ const VALID_FORM_SIGNATURES: [[bool; 10]; 13] = [
576
576
] ;
577
577
578
578
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
+
579
774
/// Constructs a [`Schema`] from a [`SerdeSchema`].
580
775
///
581
776
/// ```
0 commit comments