From 8ec1fa1761b01d66b3abece1b745fb03c441f397 Mon Sep 17 00:00:00 2001 From: Priec Date: Sun, 26 Oct 2025 16:44:15 +0100 Subject: [PATCH] validation2 I dont know if its correct??? --- common/build.rs | 4 +++ common/proto/table_validation.proto | 10 ++++++- common/src/proto/descriptor.bin | Bin 33062 -> 33667 bytes common/src/proto/komp_ac.table_validation.rs | 28 +++++++++++++++---- server/src/table_validation/get/service.rs | 16 +++++++---- 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/common/build.rs b/common/build.rs index 20be794..2440bb0 100644 --- a/common/build.rs +++ b/common/build.rs @@ -12,6 +12,10 @@ fn main() -> Result<(), Box> { ".komp_ac.table_validation.CharacterLimits", "#[derive(serde::Serialize, serde::Deserialize)]", ) + .type_attribute( + ".komp_ac.table_validation.DisplayMask", + "#[derive(serde::Serialize, serde::Deserialize)]", + ) .type_attribute( ".komp_ac.table_validation.TableValidationResponse", "#[derive(serde::Serialize, serde::Deserialize)]", diff --git a/common/proto/table_validation.proto b/common/proto/table_validation.proto index 1952307..f7ef833 100644 --- a/common/proto/table_validation.proto +++ b/common/proto/table_validation.proto @@ -23,9 +23,10 @@ message FieldValidation { CharacterLimits limits = 10; // Future expansion: // PatternRules pattern = 11; - // DisplayMask mask = 12; + DisplayMask mask = 3; // ExternalValidation external = 13; // CustomFormatter formatter = 14; + bool required = 4; } // Character length counting mode @@ -49,6 +50,13 @@ message CharacterLimits { CountMode countMode = 4; // defaults to CHARS if unspecified } +// Mask for pretty display +message DisplayMask { + string pattern = 1; // e.g., "(###) ###-####" or "####-##-##" + string input_char = 2; // e.g., "#" + optional string template_char = 3; // e.g., "_" +} + // Service to fetch validations for a table service TableValidationService { rpc GetTableValidation(GetTableValidationRequest) diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index d552ef0644e8ff0cdfc198233176d076ef0813c0..61967eb249bdbab789494fea05f4c80560792ffd 100644 GIT binary patch delta 1617 zcmYjRL2nyH7~TDLc4LoIJ6${V#&yYN?SPTpSPqKqNJ$l^v12z*5k7!8MTVLZK@;P; zhn_5z0~`@6aX|tqA*R89X-MB)6ty4x#C@8upBKj?OW44T#?DMXw6pKtC#mfie;qZ3e$LawbyxN zns>hM{$cjRKfC?#hh90kCxsv)*IJ`&t{NtK)m^zPZC-PD@kWG9prjii3uyJ0{6MJz z@|4LPg@fM7mSr1?LAxT)SC>h(~s|Sr#DVCK#nP}bOz~wN0^2@MHG4|jkc$DKRBO~~iQ!AVb2&D?$ z)I<}Lsw`yOOl2W6A*(?4k&+=sHI)62n^lrpOb}NSkrf+PamVHf2;wS6R#jqvTKHqX zHmgxW6S&RV@@j;b;jQ5aNC;Q#7`tX}&F8!Be|9>zjuby^Kd{%Gs*R>coWg+k$7AOG&+R|tHV1cky(VJrpn9-u=Hbv*zec-G@9Dijbx z)zca2sU1*ikQXGP9o~5G5E}~*9%3V&)*d{>#;vUO_z+WUQt^$+*&+xDE=93;v`sx) zd>y6f7KN81bvvM$NN4c;>j!~gpA*Q`*2l-}%plhWnI0q88D~^nwIa7yXLv$1?s;g%6p|oj@ zH39%Fwe^&MKy1g=o#z_-+F4J_Q0h=t%Xqk*g^WXW;`1lKCLV4FPXJ%+na$tSG0krj z0CdL-9Z&FBA1rFn9phkGXEW&1hThJ?i__Jg2TG82-F#GI=DM%C#&dRJJTz6)4p=9% z*rxJxxa&U6&mRCW`uZsX0<*uARDMA4>)&*>45d?@-XZS#RHp~xnobV{*=aiSi8G#D TPA}h+*MZDGzPu{Ee_eYGM(nvV delta 1041 zcmX|<&rVZ86vpqIJNI%sG%ZYvlu+fi6fvbKEkY?sTaW_M(imf+aalLUsFa8sS2Y^q z!j;a(mH%Q~n{?+x_y8t8fr(3(#B-)I-Q47x@B5uO=gfWe8os@R?;m&I#jN_g^Oqf~ zx7Ux=o!zg4e)Am!lfsvrIs0mJB{SGO_`+CP{l4)7elhj_@W{=+Vd`RQITbb^o}N7J zKJRo-AB9ioQwz&0*MvH2wbh@)oG1wJ9LeXLoH}n6Vsl`7VlXW}Fu}P?4d>O?(Wh=60;)krSR)_NJ(9xu`S=8Ng$k`D zm^4A=k+K*KvoyjOVoQkK)fl!>RJG2%Y7vBi0pa4fEk%WkQm+he0fdXVvSkgUD5;;F za=rxP2BtAf(J8Aak(v<|0Y1LUsmdkgG(6TKD`QGgUS_(lR|jS*LRV^-qvPT ztcRs4@ymu|l2>7)XgnIQ>d#t*Ts2*_3b~DVK?qzlmwe0FVSN-X=Ll^DIlVqk+pfV3 zF&qVMpk~&G3WK$Xen;}KUTr#MFtqA0Z7|w;eS}d{^@y|{V)dyD8tZfVPZ}`X5(?xR zBaRl{h)fuc7T!oC&2=cYA!97pCpCO04z&1fnYJD!=R!TTC;6_k&-Bn9rgrOIpvD)LPCs1VyrB=7qtPkYaLSH*c& Nq#yJKXSdGF{{b$XV_g6M diff --git a/common/src/proto/komp_ac.table_validation.rs b/common/src/proto/komp_ac.table_validation.rs index 2fc6e6f..dbd6ba4 100644 --- a/common/src/proto/komp_ac.table_validation.rs +++ b/common/src/proto/komp_ac.table_validation.rs @@ -23,14 +23,16 @@ pub struct FieldValidation { #[prost(string, tag = "1")] pub data_key: ::prost::alloc::string::String, /// Current: only CharacterLimits. More rules can be added later. - /// - /// Future expansion: - /// PatternRules pattern = 11; - /// DisplayMask mask = 12; - /// ExternalValidation external = 13; - /// CustomFormatter formatter = 14; #[prost(message, optional, tag = "10")] pub limits: ::core::option::Option, + /// Future expansion: + /// PatternRules pattern = 11; + #[prost(message, optional, tag = "3")] + pub mask: ::core::option::Option, + /// ExternalValidation external = 13; + /// CustomFormatter formatter = 14; + #[prost(bool, tag = "4")] + pub required: bool, } /// Character limit validation (Validation 1) #[derive(serde::Serialize, serde::Deserialize)] @@ -49,6 +51,20 @@ pub struct CharacterLimits { #[prost(enumeration = "CountMode", tag = "4")] pub count_mode: i32, } +/// Mask for pretty display +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DisplayMask { + /// e.g., "(###) ###-####" or "####-##-##" + #[prost(string, tag = "1")] + pub pattern: ::prost::alloc::string::String, + /// e.g., "#" + #[prost(string, tag = "2")] + pub input_char: ::prost::alloc::string::String, + /// e.g., "_" + #[prost(string, optional, tag = "3")] + pub template_char: ::core::option::Option<::prost::alloc::string::String>, +} #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct UpdateFieldValidationRequest { diff --git a/server/src/table_validation/get/service.rs b/server/src/table_validation/get/service.rs index a04807f..43e82c7 100644 --- a/server/src/table_validation/get/service.rs +++ b/server/src/table_validation/get/service.rs @@ -40,12 +40,16 @@ impl TableValidationService for TableValidationSvc { // Set the data_key from the database row fv.data_key = r.data_key; - // Skip if limits are all zero - if let Some(lims) = &fv.limits { - if lims.min == 0 && lims.max == 0 && lims.warn_at.is_none() { - continue; - } - } + // Keep entries that have either meaningful limits or a mask + let has_meaningful_limits = fv + .limits + .as_ref() + .map_or(false, |l| l.min > 0 || l.max > 0 || l.warn_at.is_some()); + let has_mask = fv.mask.is_some(); + if !has_meaningful_limits && !has_mask { + continue; + } + fields_out.push(fv); } Err(e) => {