@@ -638,6 +638,10 @@ pub fn derive_rupring_doc(item: TokenStream) -> TokenStream {
638
638
format ! ( r#"#[derive(rupring::serde::Serialize, rupring::serde::Deserialize)]"# ) . as_str ( ) ;
639
639
define_struct_for_json += format ! ( r#"pub struct {struct_name}__JSON {{"# ) . as_str ( ) ;
640
640
641
+ let mut json_field_names = vec ! [ ] ;
642
+ let mut path_field_names = vec ! [ ] ;
643
+ let mut query_field_names = vec ! [ ] ;
644
+
641
645
for field in ast. fields . iter ( ) {
642
646
let mut description = "" . to_string ( ) ;
643
647
let mut example = r#""""# . to_string ( ) ;
@@ -759,6 +763,8 @@ pub fn derive_rupring_doc(item: TokenStream) -> TokenStream {
759
763
}
760
764
761
765
if is_path_parameter {
766
+ path_field_names. push ( field_name. clone ( ) ) ;
767
+
762
768
code += format ! (
763
769
r#"swagger_definition.path_parameters.push(rupring::swagger::json::SwaggerParameter {{
764
770
name: "{field_name}".to_string(),
@@ -778,6 +784,8 @@ pub fn derive_rupring_doc(item: TokenStream) -> TokenStream {
778
784
}
779
785
780
786
if is_query_parameter {
787
+ query_field_names. push ( field_name. clone ( ) ) ;
788
+
781
789
code += format ! (
782
790
r#"swagger_definition.query_parameters.push(rupring::swagger::json::SwaggerParameter {{
783
791
name: "{field_name}".to_string(),
@@ -796,6 +804,8 @@ pub fn derive_rupring_doc(item: TokenStream) -> TokenStream {
796
804
continue ;
797
805
}
798
806
807
+ json_field_names. push ( field_name. clone ( ) ) ;
808
+
799
809
define_struct_for_json += format ! (
800
810
r#"
801
811
pub {field_name}: {field_type},
@@ -853,5 +863,44 @@ pub fn derive_rupring_doc(item: TokenStream) -> TokenStream {
853
863
854
864
code += define_struct_for_json. as_str ( ) ;
855
865
866
+ let mut request_bind_code = "" . to_string ( ) ;
867
+ request_bind_code +=
868
+ format ! ( r#"impl rupring::request::BindFromRequest for {struct_name} {{"# ) . as_str ( ) ;
869
+
870
+ request_bind_code +=
871
+ "fn bind(&mut self, request: rupring::request::Request) -> rupring::anyhow::Result<Self> {" ;
872
+ request_bind_code += "use rupring::ParamStringDeserializer;" ;
873
+
874
+ request_bind_code += format ! ( "let mut json_bound = rupring::serde_json::from_str::<{struct_name}__JSON>(request.body.as_str())?;" ) . as_str ( ) ;
875
+
876
+ request_bind_code += format ! ( "let mut bound = {struct_name} {{" ) . as_str ( ) ;
877
+
878
+ for field_name in json_field_names {
879
+ request_bind_code += format ! ( "{field_name}: json_bound.{field_name}," ) . as_str ( ) ;
880
+ }
881
+
882
+ for field_name in path_field_names {
883
+ request_bind_code += format ! (
884
+ r#"{field_name}: rupring::ParamString(
885
+ request.path_parameters["{field_name}"].clone()
886
+ ).
887
+ deserialize().
888
+ map_err(
889
+ |_|Err(rupring::anyhow::anyhow!("{field_name} is invalid"))
890
+ )?,
891
+ "#
892
+ )
893
+ . as_str ( ) ;
894
+ }
895
+
896
+ request_bind_code += format ! ( "}};" ) . as_str ( ) ;
897
+
898
+ request_bind_code += "Ok(bound)" ;
899
+ request_bind_code += "}" ;
900
+
901
+ request_bind_code += format ! ( r#"}}"# ) . as_str ( ) ;
902
+
903
+ code += request_bind_code. as_str ( ) ;
904
+
856
905
return TokenStream :: from_str ( code. as_str ( ) ) . unwrap ( ) ;
857
906
}
0 commit comments