рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдбреАрдПрд╕рдПрд▓

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд░рддреНрди рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рддреЗ рд╕рдордп рдЬрд┐рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


  • рдЖрд░рд╛рдо
  • рдЬрд╛рджреВ рдХреА рдХрдореА
  • рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ
  • рдЕрдиреБрдХреВрд▓рди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдПрдХ рдиреНрдпреВрдирддрдоред

рдЗрдирдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ рд╕рднреА рдмрд┐рдВрджреБ рдкрд╣рд▓реЗ - рд╕рд░рд▓рддрд╛ рд╕реЗ рдмрдВрдзреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрдкрдХрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛ред


рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рдХреНрд▓рд╛рд╕ рдФрд░ рдмреНрд▓реЙрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдбреАрдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд╛рдорд╛рдиреНрдп рдШреЛрд╖рдгрд╛рддреНрдордХ-рдЕрдирд┐рд╡рд╛рд░реНрдп (рд╣рд╛рд╣рд╛, рдареАрдХ рд╣реИ, рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рд╣рд╛рдБ? "рдШреЛрд╖рдгрд╛-рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛") рдХреЗ рд░реВрдк рдореЗрдВ DSL, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЦреА рдореЗрдВ, рдореЗрд░реЗ DSL рдмрд╕ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдиреНрдп рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ) рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЬрдЧрд░), рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рднреА рд╣реЛред


рдореИрдВ рдЖрдЦрд┐рд░реА рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдкрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЧрдбрд╝рдмрдбрд╝ рд▓рд┐рдЦрд╛ рд╣реИред рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдкрд╣рд▓реЗ, рдореИрдВ рдХреБрдЫ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рджреВрдВрдЧрд╛ рдФрд░ рдлрд┐рд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред


рдкрд░рд┐рднрд╛рд╖рд┐рдд


рд╕рдВрдкреВрд░реНрдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреАрди рд╕рд░рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ , рдЦрд╛рдХрд╛ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди ред


  • рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╡рд╣ рд╣реИ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╣реИред рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рд╣рдорд╛рд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
  • рдПрдХ рд╕реНрдХреАрдорд╛ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдбреЗрдЯрд╛ (рд╣рдорд╛рд░реА рдорд╛рдиреНрдпрддрд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдордирдорд╛рдирд╛ рдбреЗрдЯрд╛ рд╣реИред
  • рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдлрд╝рдВрдХреНрд╢рди t(b, f) рдЬреЛ рдПрдХ рд╕рд░реНрдХрд┐рдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди (рдлреИрдХреНрдЯреНрд░реА) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд░реНрдХрд┐рдЯ рдпрд╛ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
    рд╡реИрд╕реЗ, рдЧрдгрд┐рдд рдореЗрдВ "рд░реВрдкрд╛рдВрддрд░рдг" рд╢рдмреНрдж рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ "рдлрд╝рдВрдХреНрд╢рди" (рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрд╕реНрддрдХ рдореЗрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ) рд╢рдмреНрдж рдХрд╛ рдкрд░реНрдпрд╛рдп рд╣реИред

рдХрд╛рд░рдЦрд╛рдиреЗ, рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


  • рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП T1, T2, ..., Tn , рдПрдХ рд░рдЪрдирд╛ Ta(Tb(Tc(...))) (рдЖрджреЗрд╢ рдордирдорд╛рдирд╛ рд╣реИ)ред
  • рдкрд░рд┐рдгрд╛рдореА рд░рдЪрдирд╛ рдХреЛ рдЪрдХреНрд░реАрдп рд░реВрдк рд╕реЗ рд╕рд░реНрдХрд┐рдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рддрд░реНрдХ рд╕реЗ рдЕрд▓рдЧ рди рд╣реЛ рдЬрд╛рдПред

рдпрд╣ рдореБрдЭреЗ рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрди рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ (рдпрд╛ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди) рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рдФрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпреЛрдЬрдирд╛ рдФрд░ / рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд▓рдд рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг


рд░реЗрдбрд┐рдЯ рдкрд░, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рд╕реВрдЦреЗ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛:


 user_schema = Dry::Schema.Params do required(:id).value(:integer) required(:name).value(:string) required(:age).value(:integer, included_in?: 0..150) required(:favourite_food).value(array[:string]) required(:dog).maybe do hash do required(:name).value(:string) required(:age).value(:integer) optional(:breed).maybe(:string) end end end user_schema.call(id: 123, name: "John", age: 18, ...).success? 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ required(..).value рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ required(..).value рдФрд░ рддрд░реАрдХреЗ рдЬреИрд╕реЗ #array ред


рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рддреБрд▓рдирд╛ рдХрд░реЗрдВ:


 is_valid_user = StValidation.build( id: Integer, name: String, age: ->(x) { x.is_a?(Integer) && (0..150).cover?(x) }, favourite_food: [String], dog: Set[NilClass, { name: String, age: Integer, breed: Set[NilClass, String] }] ) is_valid_user.call(id: 123, name: 'John', age: 18, ...) 

  1. рдПрдХ рд╣реИрд╢ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ (рд╡рд░реНрдЧреЛрдВ, рд╕рд░рдгрд┐рдпреЛрдВ, рд╕реЗрдЯреЛрдВ, рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рднреА рдЬрд╛рджреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ ( #build рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ)ред
  2. рдЕрдВрддрд┐рдо рд╕рддреНрдпрд╛рдкрди рдореВрд▓реНрдп рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рдЪ / рдЧрд▓рдд рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЕрдВрддрддрдГ рдЪрд┐рдВрддрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд░рд▓реАрдХрд░рдг рд╣реИред
  3. рд╢реБрд╖реНрдХ рдореЗрдВ, рдмрд╛рд╣рд░реА рд╣реИрд╢ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╛рд╣рд░реА рд╕реНрддрд░ рдкрд░, Schema.Params рдкрджреНрдзрддрд┐ рдХрд╛ Schema.Params , рдФрд░ #hash рдЕрдВрджрд░ред
  4. (рдмреЛрдирд╕) рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдиреНрдп рд╡рд╕реНрддреБ рдХрд╛ рд╣реИрд╢ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: is_int = StValidation.build(Integer) ред
    рд╕рд░реНрдХрд┐рдЯ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рд╕реНрд╡рдпрдВ рдПрдХ рд╕рд░реНрдХрд┐рдЯ рд╣реИред рдПрдХ рд╣реИрд╢ рдПрдХ рдЬрдЯрд┐рд▓ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ (рдпрд╛рдиреА рдРрд╕реА рдпреЛрдЬрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдпреЛрдЬрдирд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред

рд╕рдВрд░рдЪрдирд╛


рдкреВрд░реЗ рд░рддреНрди рдореЗрдВ рдмрд╣реБрдд рдХрдо рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:


  • рдореБрдЦреНрдп рдирд╛рдо рд╕реНрдерд╛рди (рдореЙрдбреНрдпреВрд▓) StValidation
  • рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд╛рд░рдЦрд╛рдирд╛ StValidation::ValidatorFactory ред
  • рдЕрдореВрд░реНрдд рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ StValidation::AbstractValidator , рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред
  • рдореВрд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд╕реЗрдЯ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореВрд▓ "рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕" рдореЗрдВ StValidation::Validators рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ
  • рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдЕрдиреНрдп рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рджреЛ рддрд░реАрдХреЗ:
    • StValidation.build - рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдПрдХ рдорд╛рдирдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
    • StValidation.with_extra_transformations - рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдПрдХ рдорд╛рдирдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реБрдПред

рдорд╛рдирдХ рдбреАрдПрд╕рдПрд▓


рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдкрдиреЗ рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ:


  • рдХреНрд▓рд╛рд╕ - рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯреЗрдЧрд░) рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред
    рдореЗрд░реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛, рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрд╕реЗрдиреНрд╕рд╡реЗрд▓реЗрдбрд┐рдПрдЯрд░ рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХреА рдЖрджрд┐рдо рд╣реИрдВред
  • рдмрд╣реБрдд рдХреБрдЫ рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдШ рд╣реИред рдЙрджрд╛рд╣рд░рдг: Set[Integer, ->(x) { x.nil? }] Set[Integer, ->(x) { x.nil? }] ред
    рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдпреЛрдЬрдирд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд░реНрдЧ рдХреЛ рд╣реА UnionValidator рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
    рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рдордЧреНрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реИред
  • рдПрдХ рд╕рд░рдгреА рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: [Integer] ред
    рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдПрдХ рд╕рд░рдгреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рддрддреНрд╡ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
  • рдПрдХ рд╣реИрд╢ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╣реИрд╢ рдХреЗ рд▓рд┐рдПред рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдВрдЬреА рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕реЗрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 def basic_transformations [ ->(bp, _factory) { bp.is_a?(Class) ? class_validator(bp) : bp }, ->(bp, factory) { bp.is_a?(Set) ? union_validator(bp, factory) : bp }, ->(bp, factory) { bp.is_a?(Hash) ? hash_validator(bp, factory) : bp }, ->(bp, factory) { bp.is_a?(Array) && bp.size == 1 ? array_validator(bp[0], factory) : bp } ] end def class_validator(klass) Validators::ClassValidator.new(klass) end def union_validator(blueprint, factory) Validators::UnionValidator.new(blueprint, factory) end # ... 

рдХрд╣реАрдВ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рд╣реИ?


рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ # рд╢рд┐рдХрд╛рдпрдд


рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рд╡реИрдз рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдорд╛рдиреНрдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ рдПрдХ рдкрдХреНрд╖ рдкреНрд░рд╢реНрди рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдордЭрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╛рдиреНрдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ #explain рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реАред


рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрд▓рдд рд╣реИ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рддреНрдпрд╛рдкрди ( #call ) рдХреЛ #call рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдЕрдЧрд░ рдЬрд╛рдБрдЪ рдкрд░рд┐рдгрд╛рдо рдЦрд╛рд▓реА рд╣реИ рддреЛ рдЬрд╛рдБрдЪ рдХрд░рдХреЗред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреА рдорд╛рдиреНрдпрддрд╛ рдзреАрдореА рд╣реЛрдЧреА (рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ)ред


рдХреНрдпреЛрдВрдХрд┐ рдмреЗрдирд╛рдореА рд╡рд┐рдзреЗрдп рдХрд╛рд░реНрдп рдЕрдкрдиреЗ рдЖрдк рдХреЛ AbstractValidator рд╡рдВрд╢ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ; рдЙрдирдХреЗ рдкрд╛рд╕ #explain рд╡рд┐рдзрд┐ рднреА рд╣реЛрддреА рд╣реИ рдФрд░ рдмрд╕ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛рдБ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред


рдХрд╕реНрдЯрдо рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, #explain рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬрдЯрд┐рд▓ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдЕрдиреБрдХреВрд▓рди


рдореЗрд░рд╛ "рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕" рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред (рджреЗрдЦреЗрдВ StValidation.build )ред


рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдбреАрдПрд╕рдПрд▓ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдПрдВ, рддрд╛рд░ рдФрд░ рд╕рд░рдгрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА:


 validator_factory = StValidation::ValidatorFactory.new( [ -> (blueprint, _) { blueprint == :int ? ->(x) { x.is_a?(Integer) } : blueprint }, -> (blueprint, _) { blueprint == :str ? ->(x) { x.is_a?(String) } : blueprint }, lambda do |blueprint, factory| return blueprint unless blueprint.is_a?(Array) inner_validators = blueprint.map { |b| factory.build(b) } ->(x) { x.is_a?(Array) && inner_validators.zip(x).all? { |v, e| v.call(e) } } end ] ) is_int = validator_factory.build(:int) is_int.call('123') # ==> false is_int_pair = validator_factory.build([:int, :int]) is_int_pair.call([1, 2]) # ==> true is_int_pair.call([1, '2']) # ==> false 

рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд░рдгреА рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИред


рдкрд░рд┐рдгрд╛рдо


рд▓реЗрдХрд┐рди рдЙрд╕реЗ рдирд╣реАрдВред рдореБрдЭреЗ рдЗрд╕ рддрдХрдиреАрдХреА рд╕рдорд╛рдзрд╛рди рдкрд░ рдЧрд░реНрд╡ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ :)

Source: https://habr.com/ru/post/hi479600/


All Articles