From a05f1f2a1e13506a84a70726a0839f1b327c8776 Mon Sep 17 00:00:00 2001 From: Priec Date: Fri, 29 May 2026 12:18:13 +0200 Subject: [PATCH] removed formatter for rules --- Cargo.lock | 12 ++++----- client | 2 +- common/build.rs | 8 ------ common/proto/table_validation.proto | 21 +-------------- common/src/proto/descriptor.bin | Bin 75490 -> 74355 bytes common/src/proto/komp_ac.table_validation.rs | 25 ------------------ server | 2 +- tui-pages | 2 +- .../docs/validation_architecture.md | 12 --------- validation-core/src/config.rs | 18 ------------- validation-core/src/lib.rs | 5 ++-- 11 files changed, 12 insertions(+), 95 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52472c6..f16e59a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -493,7 +493,7 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "canvas" -version = "0.6.14" +version = "0.6.15" dependencies = [ "anyhow", "async-trait", @@ -586,7 +586,7 @@ dependencies = [ [[package]] name = "client" -version = "0.6.14" +version = "0.6.15" dependencies = [ "anyhow", "async-trait", @@ -642,7 +642,7 @@ dependencies = [ [[package]] name = "common" -version = "0.6.14" +version = "0.6.15" dependencies = [ "prost 0.13.5", "prost-build 0.14.1", @@ -3117,7 +3117,7 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "search" -version = "0.6.14" +version = "0.6.15" dependencies = [ "anyhow", "common", @@ -3216,7 +3216,7 @@ dependencies = [ [[package]] name = "server" -version = "0.6.14" +version = "0.6.15" dependencies = [ "anyhow", "bcrypt", @@ -4549,7 +4549,7 @@ dependencies = [ [[package]] name = "validation-core" -version = "0.6.14" +version = "0.6.15" dependencies = [ "regex", "serde", diff --git a/client b/client index 426f85d..768592e 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit 426f85d6cf741e54485224cdc7d8e31f4f13ec02 +Subproject commit 768592e67334b1a5155584c35dd7a08df4b0eac9 diff --git a/common/build.rs b/common/build.rs index aeefe9a..dd77ea9 100644 --- a/common/build.rs +++ b/common/build.rs @@ -40,14 +40,6 @@ fn main() -> Result<(), Box> { ".komp_ac.table_validation.PatternRules", "#[derive(serde::Serialize, serde::Deserialize)]", ) - .type_attribute( - ".komp_ac.table_validation.CustomFormatter", - "#[derive(serde::Serialize, serde::Deserialize)]", - ) - .type_attribute( - ".komp_ac.table_validation.FormatterOption", - "#[derive(serde::Serialize, serde::Deserialize)]", - ) .type_attribute( ".komp_ac.table_validation.AllowedValues", "#[derive(serde::Serialize, serde::Deserialize)]", diff --git a/common/proto/table_validation.proto b/common/proto/table_validation.proto index a60015b..efd95ce 100644 --- a/common/proto/table_validation.proto +++ b/common/proto/table_validation.proto @@ -13,7 +13,7 @@ package komp_ac.table_validation; // // Important split: // - limits / pattern / allowed_values / required are validation rules. -// - mask / formatter are presentation and input-shaping metadata for clients. +// - mask is presentation and input-shaping metadata for clients. // Request validation rules for a table message GetTableValidationRequest { @@ -44,9 +44,6 @@ message FieldValidation { // Client-side hint that this field participates in external/asynchronous validation UI. bool external_validation_enabled = 13; - // Client-side formatter metadata. This is intentionally data-only, not executable code. - optional CustomFormatter formatter = 14; - // Client-side display mask metadata. The server stores raw data without mask literals. DisplayMask mask = 3; @@ -139,22 +136,6 @@ message PatternRule { CharacterConstraint constraint = 2; } -// Client-side formatter metadata. -// The formatter "type" is intended to be resolved by a client-side formatter registry. -message CustomFormatter { - // Formatter type identifier; handled client‑side. - // Examples: "PSCFormatter", "PhoneFormatter", "CreditCardFormatter", "DateFormatter" - string type = 1; - - repeated FormatterOption options = 2; - optional string description = 3; -} - -message FormatterOption { - string key = 1; - string value = 2; -} - // Exact-value whitelist configuration. // This maps to canvas AllowedValues semantics. message AllowedValues { diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 0985e4803134cdb8547d97aba3010f586f0b94b6..ac5dc14718f51edfc5cabf374762aa86ceb61a0a 100644 GIT binary patch delta 7358 zcmYkBd$3hi9mn@tXP0EH`#Pm8pqa_v(kyhn&Atl zmlOVF8`Ao;EPpmoW2RJsCbp%kodm-f#earZO-~Tdut_jVkj$uSQbIB#Ye~;?lDe!k zv)KH|qGIJEtz9}t9VRoIvvg`|%TX4e7R@c{9-Z2FTDdVjHjT@Xjk40L;*3Y9$|o^I>Ika1L}gyHF!c|&0Kn4!gRwpBwbV`GMdG{?3EA0-Uu*rv3@ z&t1ZD4k=xp+PIX(XGUKyK6~`?rZX$;>CX&lmL%Z$#TAe3xNyF$h!6P_KIT_lj6(RI z-_$HoK@2Uh6M~_kmGaWIc8E5gi(Kn0B_Kh^2TWLvW;v$wT z&nsr`KP5jegv+0BabC6AxqxtSUQ27*;mjFYY&!;P1FNTBGJWd6;G{txb!;W&#bZ7s z<;B&O;6qYg+}0j^kn$2cdECbe@lhPvUp;L}sDWR~OF|7Gye-N4gEy(clEF#os3cX+ z;_pNk7SkRd&A&tMq!(pLYN_?+084zS^%a3|wY06vxq@)Dw6`zF7+U7n3qB;DWg#C( z#;SflK**M{c>HYSv)s0%xvY`0+l0%Q*WnX`qvO`T4uZk`+{JT_^ z)K--{B&f2H(p_Ya6Nvyr7uiWlBzn>3rUXNVR@=TXBtG)hwo?(y)jhqz61dp*h9N1) z#o+`nR`%<~;RG;Jol9&_Fq9HpV%wE4yrio;cqHjdeF+Fsvb@xGr=33L7|TmZbEB+| zB#SSPeo#~oY@C02#i`>&Qe5Mc5@2<#@qr8BYfYESN{E2g95a~CW>F;)_}b!?19NAu z4XcztQSP;&+>lsgE@Cl9yq1XPI59!3v%OtkD4rfUt~h#cQmh|oICb5aBiZun#vI91 z>%x{#+?HQQjeHb%T~8EKi>96B;x8i&`T8*@vV_);Ig$FUAB#qo(0W%tTeeyGhtZFX z@4n3S!?Hhvt(4{pJJr=3VCV`vMTr!yIQ|6J0kX_7 zCGexLglIR0KMJb`k}>KlE6=5QRakidhF6Wrhu zZ^d|nv4d#?tJz(Hg1w410|z8(v1O@jG`RJ)+<$^Sir8*6_+7%Hs>_mVO>~1XU0)se zMzP`Pv-4{W=P7RDIw}}nXE=LsBZOCQf+Ak8Gg+4+7teKuTG zZ3Bu(uQ!t>r{9%;Dp~Rq6Wv<;;hAN51;d}1ikx?GT#P8D2~IZVA<79#*@cYFQLu zoqFaN09mWENUfSBg^BJg%FoSgsbW`{N^5#LnN=mTEyY>SopL7sB&{u)7D(x~m|B~Q z4Mexaw7Xu44*y%Emy4Vm2DcW^KljynRcmmwb=-}lxK*pes92iJEg#&lzd@GI*{MyU zEZJtFM~ZWvKkIATOvQCHkvC7g-PmtR96~tQZW32sL5i~7bk5LG{B1XL7Rx?o6x$ue z2hY!)w!5(Qf=-f6l|4hqf<@Qh{BM@A{oea0>ggKRx8=~P5|pXoYD z5$S#AOBVzw#k}9x6=6_rp!;>!$&nmN@Yu9vwD-%jr@CqB=dR+x-_FW+jn9^#*fl;| zf@0VBY;{>YWbFB2wmN1T8n1jE(xLIn^K=F0d@BT6$>QDPIm&k0t+Ntn1?}$fX)9=V z%d}r{fmXA4PjT}L3#RQEpRI~w&-iRr6nkX0FF8e;#lyvaUpONl)=46pq8J{ZBSkUn zQ?qfJC6Aft2~O`?T8dMmd(2cOyKR=rdfRKb%w!KjlpL%mV!PK=TNUxT*R;#SGR8P( zbf0eTRBkpw)ymr6XR2Ay%G%$jyE~OdwqH*w2q~yiS;_ki&q*JYEW!PT_oSZ|dfc75 zxeK{Or(u5}rE&{^ncumfvv#MujcZwQz(h}nLe#K4U@FHtw>2rmh~Z5pb3#M}`tt_F zcEr>*>L^}EOwO}RLaIr;PiZy~TF_?$y3vpgi1sO;jg9NG;gFS2FC3(+M9Zb=vi$Igcek-MD(n-hEb%?N^6#pOue*bwAk{}`8oe& z^N#B222$!#Q}cHbh?`N8=4sCj5B`~gSdLbbjs(Kc%nv!wMG!0 zK=mXgIy~-)X>&N-zgXkyu+*qgTvfP%-!%5mrsTt_NDgnBihOy=Oc=jqV!yf}T!T83 zRPilS(~P8wZ<#*7oSG!6w@rKkesjrJzA0e8U_i8Qn^ym71JS;1jypa~%RKLxxG$8d z?6Ind^c}-Tu`i_DdGDBR>5z?^v*bM!{WUbN8O!%fCGU5Kelxes`^Npc6UWU}TKT@I z)jKZ`rvHzW*rAl6S=#=Au4jmNK);?rq#u~Do+ANT=fWCwvu0GUe zfmna2y#jIdq4a9dML|qQiWgq(o7e1meq`K@97;z_&A)OP#my0O%<(=q*YYD~+Vpgu zbA!{Pra1o4+`QTCi=(`+iT)l+I|0kTnTmYl#_aQ{zw`R#_CfaEI z# ziI`q(LxU&EEZ5lZM1m*@=wk=5y~c)X7$o*%!ukb)xRT!7th*gYWH zYpuHtY}}S5H`wUr5K$YJH`wrKYmwBfA+;TH4_2C==-hW>(hz0rpIvrQtp$=Zpz z3kgIE`)oir92yLwy~(^t-eM!?#hz8Y_vVN?ZWadEq#}`-Ddd(My>>iO#u2$08-6u zw&s4%kWr-D?4&9FaRoEWHp@>mQqJxy`MHgL5oYPe^yfNDx6HCbgNKM6^s$53?$Fpl zyzbEcc1tzy)=dB*z1!wvS}EtL_JvkQXAYO5#6f|hHwk| z27}n%tNjJ>daw4khluicr#2Ww3;Jw8v^#BRFo<@iHn=xSer2NvLqxq;{z@C%D-k`Q zHG=R8daoe14`_{g{rU5N7O7W?w9AH{N+7hLY9*pwHhfDlN<_PC_@$&*o_4>0_Erzhtvl+X@j8=pzEL-K%W{iD<8OwO{7k zr(K1Rf+FSohuv^!D~NWVwzXff*{_9w(1JRxc;2tAVHD|pZOuTIJZbq~K!0TpVELr( zngL1X0IgZ=jtdaCu0XHe6BmrOhg?`Cqz85{JVp zmKGaTL7iK1gZV${j>`v^4)+f(S=OivW!algwx8>LU1xs3!H*|r$CZ7>WxYfF=J&?3 ztm3gL$yefN=eq5g9RPa{z%Cj@oW7&T{`$ctfFD@CL zwyeLe_&M#x#o?a5p5dOZ!i|gimlfo1$uM%H)iW@#q99|_2A2%1m|9peI9w>+TkQST zaLckT&7fqNL7mZ4JQg(6H@O*D}`uY0i8YfbY$i+!r{BxKdSe;((edJM@UYo>IW1S0<@Y3M&tYc(q^`*J$`0O~$1v*H|W@LXiG9{g%8^wbB zr1`C7Qe0^SFgH_Ixglk!+!KN`5wn88tdgKcaF+IhTE49`hS$?&34 zoUVW|A|<=ed;a!kXt&hOjsJd~Fo~CjWeGO8{YP{zSWaAdJm#ZF6c2-C-vPHl$~FxU3)1I+{D_ipY48u( zS$kH^UYa-BVI(QuW0MkKcHCnF7sA#(%_b`$0=lQ8Grp8b6-nU3*&p}JoIdR4DL+x} zVOMTQBoY&`h@(7A#50UCK`qbbzdURD@{+Qg9?MJ0Vt%<>*O8eh%c+a?jHQ)$o|@@b zl5}OsfJ~W{B?D5gl_l>oWmcMc>6}h--wswQ+imgl?VR0YwUpvMJ=N40VCX(Q#Sc7q&_g5GX~?1N(WCT3H45AM#iUd2Tb-o~Nnf$AFg#dTP%I1;mkkd5J-A>+p{LOMf8J__iVORf4W~mZxS&+V zWg!QDxL&dMZj^&EFV)z-iR||`Jmh=ta$oe?>ogd2G zsVgqbzPD%b(t+Z#OA4LW|7~~4Kqsfg^@|3V6#Xyhko?p=RP5^??(P}t^S_&)ujm;r z2@Z9}rhWv*X+dOpkHoz}RgCjUbvLM5IcFsc1|Lx@2I(op>;t_e`jo<4!rZWtZZY#s zq%rk~I$M^Dm|_Y&>L#NQra*6sT>xYiTT9~iQI(jfD#BQL)J|0$RwU8mDtL;8Oxe@0 z0@25%?&76F%Kn6(br5Djn=6Ry6N&>xynvW}LUE#4RR*6_oM3j4O-<0NverS4FgJ?o zlWKfY6)#{##7XoM75p?S?!7&Y5&VhD%Rw84vBa~c0cg} z;$xFy`?Ho9+^jeW?4X1PMjp**c@p2`hSA-uxX)T$YQM#;W(-TQL9Z*t-lEFAWhwR+ z#in@)nN=pyGb;E+wsGIZb(P3Hqw@9fSIMkWGTWNHv+v7a<6qL+>eB*Qzgt!1L=zi` z-d5FM_7c&<{#Mybt}$j9+?LIK^{=}t&GgzfW=2xn=BvY~NcuSeVrHAniECpW1xd7B z1+QoS{_5BNX1mIpZ6%W1b+|+6np=R7DhYh31j%4@# zdgind6}31KmUB3wCQbK<#)#^^BfiyWFt{r__3PWF?NX7+6)Q67cd6D(oQ9Nkmzv!h zcNq<6cQ&y9uhQKrGHVD8+3t6%mM=LC4lwZY+og|;QsjKRu;l8mPWn10ny%K01-F;(jd0>Gg zd4&nIA_@0rlMY-tZU30J3N-eQd8d3w-033QCc!7(2(8V7A^ zI;={fH&pP?cJ~RZi0%!Qmv?6vR>^!jq_{=N8iXi0Xm=10*+Z(L-j8DSkZO=8jHsrJ z9`?(-O0HCbURUP+VO5bhU77ob{pzlgNp{2^mk_F;SCyH3MDcL3LCF+6qIkJjx6n~@ z>Zc~;GCB?0ZMaIyRph8j?8*g=w7FgAa9k1{Q^CKuLX1Q5n97^mPdH8raolgE5D|fP zzX6dwuFCCJ3S#xRN_h`RNaG~lw|q7bx}ePlG@~vX5Z$+IHae_MqTi_CUtL7iNdCr0 zR4ozx*0%=2Drl{OD(Qq>Z(z*+*7v4bB6^$FWVLs+w%8W%8zOH@3vMUqYH7iV?3{nP zCFNfh=?TA!ft2)wKO;emolq_2o+WyiIibw0QHM22^g9*&n@gYu$=|8GJw9tBfp>gK zArb&>NkL@ak&>p;Wf-&Xa6Flk)`-vF`;tQFf;M^3jJlG7sQ%uUv^I%Os^E_fhP4vWDa9K`TtcLMN~P{>gYj}oRoZz6qI*h>x2G$Jms5%tvGlxF0{jEJt1~45 zf;K<~&8WMffT;e#-%x6$^6&a(3AnQ}6mS1jN+4a)#VyqJZAZ zEj3hhU2A1ANa~cL<5$a zJV9hXPKD4ePW;yPVA8jV(LTHB=38%M2$Z3 zHG;4NdP`EGkH#$FHig~Y3u#P!BsHoQQ+ZC>KPmm6s?3I!mmL12^76D7PY8dkLOZ)5 zOoQH&RPkd~=`)fleyrN;bQ&*FeWJn(u$xN0@@R$agaOh0MAh3T0*LM>>fH04Tl}0> zp?O}RnzLBpDko>%X~nk}TSz(EPOBE_5I&RW&nmcIo6BUFAo*vNPutCnKH)U^i!$E} z`Myv=EB~S@?cEVV^z%rG4N4gjY5S*sK10L<+W8Ek`l-KhgT(WxpU;VO{hH5wvp~uM z+7g18`ph>AMEWz|D-ctkNv}Fh6vT8UyY*;WcVc>eX3UIiN@rB1eNr)snKP>6d{ZG1 zGiTJauDIKnfmZ2k&(WD_V%Ehf?G6YK#Z@|)>=dP=tMnB4Zlc4wBzjN>-*cs{L-IkL zmyal6SSJNqt=&lpkrikQ1R}dyyWJSX>T1nNY1T!Z1p8gBtxt$lK>G#(&1j2#g@WjQ zS9gkA9o8q&8XbJ!MO2UE8tu;RdWmSQcDH|sh(No)g2=AbsXMb^%&ygLf325@)@k=% zh0q0UHlP`G`zwg*I&BVM9ZpE1AL!s=7tsVHf1vZ`vp_gOB3kcj1m#$lur&)KyxtcH z#O!)0k|a7Yi8koq5odNHk{f*KCyLoj>n_tWi1`KD`2|wVOjnwZ4rFAa!p^j;do%VR!xh?0Odb`aUeeC!~xKW1YO!v?A5<7`>RCxj{} zs_YA}8Fr@ui0ohl4z3-e(EA>LUNODaFax|+1CidDrl{O$ZqyE z0*o+St5GI z*9ama(AEf)JL)sONHAuf@kMHuh<@%D0fa7SvjNShs}YFm&wY(rlIU3-{K7@lg5O@bBzj&4zj9t$5q;i!X%#OcK6r@OK^r@W z?1+yY#OjFeZ>v;ur(XmRsylUB(v@=V)NTfK{iReY& zUAulORhOOZyk`y>LP3wm9NXjHp56Qe{ls@)fncDWMm z^~pe}f?ib&@Ab(rit1jHN$GePwhQhX)0ImO=yl~t+&88xN8&zTh(Z$W*TL(q5CtUn z`^i#}LcHc%17Q`ktpSmJE%m*DG5ebDO+n&4;3I<21#Lv28Fj4zQ9WQI3d4dF;-I$Q zeTA6%pnU*>s2)B@Sx$0_@-^tb?O2n+`x zI^?_BAwCcLu0p7SqRRdcn_<^h5Z%MRtsRoh5nl)hUC_G~%SU``7)AAnZ%t, /// Client-side display mask metadata. The server stores raw data without mask literals. #[prost(message, optional, tag = "3")] pub mask: ::core::option::Option, @@ -126,28 +123,6 @@ pub struct PatternRule { #[prost(message, optional, tag = "2")] pub constraint: ::core::option::Option, } -/// Client-side formatter metadata. -/// The formatter "type" is intended to be resolved by a client-side formatter registry. -#[derive(serde::Serialize, serde::Deserialize)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct CustomFormatter { - /// Formatter type identifier; handled client‑side. - /// Examples: "PSCFormatter", "PhoneFormatter", "CreditCardFormatter", "DateFormatter" - #[prost(string, tag = "1")] - pub r#type: ::prost::alloc::string::String, - #[prost(message, repeated, tag = "2")] - pub options: ::prost::alloc::vec::Vec, - #[prost(string, optional, tag = "3")] - pub description: ::core::option::Option<::prost::alloc::string::String>, -} -#[derive(serde::Serialize, serde::Deserialize)] -#[derive(Clone, PartialEq, ::prost::Message)] -pub struct FormatterOption { - #[prost(string, tag = "1")] - pub key: ::prost::alloc::string::String, - #[prost(string, tag = "2")] - pub value: ::prost::alloc::string::String, -} /// Exact-value whitelist configuration. /// This maps to canvas AllowedValues semantics. #[derive(serde::Serialize, serde::Deserialize)] diff --git a/server b/server index aa0f9a3..24339bf 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit aa0f9a310897adf1560b3a364ae83d38ae0a0f68 +Subproject commit 24339bf7afa6b05a8c2f9e13c45bcb7fa281c184 diff --git a/tui-pages b/tui-pages index 981d076..aa05de8 160000 --- a/tui-pages +++ b/tui-pages @@ -1 +1 @@ -Subproject commit 981d0763bdd45191e851137dbf20876d1b9f0400 +Subproject commit aa05de8dc85e3ff6c5ca253b0fcae21461c80a16 diff --git a/validation-core/docs/validation_architecture.md b/validation-core/docs/validation_architecture.md index 90ca941..656d961 100644 --- a/validation-core/docs/validation_architecture.md +++ b/validation-core/docs/validation_architecture.md @@ -282,17 +282,6 @@ mask: Canvas uses this for display/editing. Backend expects raw values without mask literals. -### Formatter - -```text -formatter: - type: "PhoneFormatter" - options: [] - description: optional -``` - -Formatter is resolved client-side. Backend stores it but does not execute it. - ### External Validation ```text @@ -331,7 +320,6 @@ limits section pattern section allowed values section mask section -formatter section external validation toggle ``` diff --git a/validation-core/src/config.rs b/validation-core/src/config.rs index a841965..c6ed9ac 100644 --- a/validation-core/src/config.rs +++ b/validation-core/src/config.rs @@ -42,19 +42,6 @@ impl AllowedValues { } } -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct FormatterSettings { - pub formatter_type: String, - pub options: Vec, - pub description: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct FormatterOption { - pub key: String, - pub value: String, -} - #[derive(Debug, Clone, Serialize, Deserialize)] pub enum CharacterFilterSettings { Alphabetic, @@ -129,7 +116,6 @@ pub struct ValidationSettings { pub pattern: Option, pub allowed_values: Option, pub display_mask: Option, - pub formatter: Option, pub external_validation_enabled: bool, } @@ -141,7 +127,6 @@ impl ValidationSettings { pattern_filters: self.pattern.as_ref().map(PatternSettings::resolve), allowed_values: self.allowed_values.clone(), display_mask: self.display_mask.clone(), - formatter: self.formatter.clone(), external_validation_enabled: self.external_validation_enabled, } } @@ -173,7 +158,6 @@ impl ValidationSettings { &rule.allowed_values, )?; merge_singleton("display_mask", &mut self.display_mask, &rule.display_mask)?; - merge_singleton("formatter", &mut self.formatter, &rule.formatter)?; if let Some(pattern) = &rule.pattern { match &mut self.pattern { @@ -220,7 +204,6 @@ pub struct ValidationConfig { pub pattern_filters: Option, pub allowed_values: Option, pub display_mask: Option, - pub formatter: Option, pub external_validation_enabled: bool, } @@ -269,7 +252,6 @@ impl ValidationConfig { || self.pattern_filters.is_some() || self.allowed_values.is_some() || self.display_mask.is_some() - || self.formatter.is_some() || self.external_validation_enabled } } diff --git a/validation-core/src/lib.rs b/validation-core/src/lib.rs index 7165c27..f048e16 100644 --- a/validation-core/src/lib.rs +++ b/validation-core/src/lib.rs @@ -3,9 +3,8 @@ pub mod rules; pub mod set; pub use config::{ - AllowedValues, CharacterFilterSettings, FormatterOption, FormatterSettings, PatternSettings, - PositionFilterSettings, ValidationConfig, ValidationMergeError, ValidationResult, - ValidationSettings, + AllowedValues, CharacterFilterSettings, PatternSettings, PositionFilterSettings, + ValidationConfig, ValidationMergeError, ValidationResult, ValidationSettings, }; pub use rules::{ count_text, CharacterFilter, CharacterLimits, CountMode, DisplayMask, LimitCheckResult,