From 8793811552b53dde647b50e4aa1e3a95a58ab2a1 Mon Sep 17 00:00:00 2001 From: ya7010 Date: Thu, 18 Dec 2025 10:24:51 +0900 Subject: [PATCH] fix: Issue #107 --- crates/serde_valid/tests/issues_test.rs | 115 ++++++++++++++++++ .../src/derive/enum_derive.rs | 8 +- 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/crates/serde_valid/tests/issues_test.rs b/crates/serde_valid/tests/issues_test.rs index 4b36bbb9..fb522424 100644 --- a/crates/serde_valid/tests/issues_test.rs +++ b/crates/serde_valid/tests/issues_test.rs @@ -27,3 +27,118 @@ mod issue54 { assert!(Fails::VariantB().validate().is_ok()); } } + +mod issue107 { + use serde::{Deserialize, Serialize}; + use serde_valid::Validate; + use std::collections::HashSet; + + // Test case 1: Named fields with some fields having validation and others not + #[allow(unused_variables)] + #[derive(Debug, PartialEq, Deserialize, Serialize, Validate)] + #[serde(untagged)] + pub enum WhiteList { + List { + #[validate(min_length = 1)] + white_type: String, + #[allow(unused_variables)] + list: HashSet, + }, + } + + #[test] + fn test_issue_107_named_fields() { + let white_list = WhiteList::List { + white_type: "ip".to_string(), + list: vec!["127.0.0.1".to_string(), "192.168.1.1".to_string()] + .into_iter() + .collect(), + }; + + assert!(white_list.validate().is_ok()); + } + + #[test] + fn test_issue_107_named_fields_validation_error() { + let white_list = WhiteList::List { + white_type: "".to_string(), + list: vec!["127.0.0.1".to_string()].into_iter().collect(), + }; + + assert!(white_list.validate().is_err()); + } + + // Test case 2: Unnamed fields with some fields having validation and others not + #[derive(Debug, PartialEq, Deserialize, Serialize, Validate)] + #[serde(untagged)] + pub enum DataEnum { + Unnamed(#[validate(minimum = 0)] i32, String), + } + + #[test] + fn test_issue_107_unnamed_fields() { + let data = DataEnum::Unnamed(5, "test".to_string()); + assert!(data.validate().is_ok()); + } + + #[test] + fn test_issue_107_unnamed_fields_validation_error() { + let data = DataEnum::Unnamed(-1, "test".to_string()); + assert!(data.validate().is_err()); + } + + // Test case 3: Multiple variants with mixed validation scenarios + #[derive(Debug, PartialEq, Deserialize, Serialize, Validate)] + pub enum MultiVariant { + Variant1 { + #[validate(maximum = 100)] + validated_field: i32, + unvalidated_field: String, + }, + Variant2 { + field1: String, + #[validate(minimum = 0)] + field2: i32, + field3: bool, + }, + Variant3(#[validate(min_length = 1)] String, i32, bool), + } + + #[test] + fn test_issue_107_multi_variant() { + let v1 = MultiVariant::Variant1 { + validated_field: 50, + unvalidated_field: "test".to_string(), + }; + assert!(v1.validate().is_ok()); + + let v2 = MultiVariant::Variant2 { + field1: "test".to_string(), + field2: 10, + field3: true, + }; + assert!(v2.validate().is_ok()); + + let v3 = MultiVariant::Variant3("test".to_string(), 10, false); + assert!(v3.validate().is_ok()); + } + + #[test] + fn test_issue_107_multi_variant_validation_error() { + let v1 = MultiVariant::Variant1 { + validated_field: 150, + unvalidated_field: "test".to_string(), + }; + assert!(v1.validate().is_err()); + + let v2 = MultiVariant::Variant2 { + field1: "test".to_string(), + field2: -10, + field3: true, + }; + assert!(v2.validate().is_err()); + + let v3 = MultiVariant::Variant3("".to_string(), 10, false); + assert!(v3.validate().is_err()); + } +} diff --git a/crates/serde_valid_derive/src/derive/enum_derive.rs b/crates/serde_valid_derive/src/derive/enum_derive.rs index 9c9b9a74..a6215e60 100644 --- a/crates/serde_valid_derive/src/derive/enum_derive.rs +++ b/crates/serde_valid_derive/src/derive/enum_derive.rs @@ -117,7 +117,9 @@ fn expand_enum_variant_named_fields_validation( fields_idents.push(quote!(#field_ident)); quote!(#token) } else { - fields_idents.push(quote!(#field_ident)); + let field_ident_with_underscore = + syn::Ident::new(&format!("_{}", field_ident), field_ident.span()); + fields_idents.push(quote!(#field_ident: #field_ident_with_underscore)); quote!() } })) @@ -184,7 +186,9 @@ fn expand_enum_variant_unnamed_fields_varidation( fields_idents.push(quote!(#field_ident)); quote!(#token) } else { - fields_idents.push(quote!(#field_ident)); + let field_ident_with_underscore = + syn::Ident::new(&format!("_{}", field_ident), field_ident.span()); + fields_idents.push(quote!(#field_ident_with_underscore)); quote!() } }))