Eskema: Validação de dados de tempo de execução ergonômica e compósável para o DART bem feito !!

Todo projeto DART tem esse arquivo – você conhece o arquivo. 🍝 Eu estive lá. Na verdade, foi isso que me levou a construir Eskema. A maioria das soluções existentes que encontrei apoiava-se na geração de código, o que significava que acabei com classes de caldeira de difícil leitura e classes gerais misteriosas. Eu queria outra coisa: uma biblioteca que era declarativa, ergonômica e não -opinada. Algo que torna óbvio o que está sendo validado e onde está acontecendo, sem borrifar espaguete na minha base de código. A Eskema começou como uma pequena biblioteca funcional há alguns anos, mas desde então cresceu: agora possui um núcleo sólido baseado em classes, o operador Sugar e uma API do construtor. Ainda é extremamente simples de estender; Adicionar um novo validador ou transformador é basicamente trivial, mas é poderoso o suficiente para cobrir a maioria das necessidades de validação do mundo real. Por que Eskema? Os principais recursos do Eskema incluem: API composta: os validadores são apenas funções de DART que assumem um valor e retornam um resultado. Você pode aninhar e combiná -los livremente (com todos (), ou () ou os operadores sobrecarregados e/|). Isso torna a lógica de validação altamente composta e fácil de raciocinar. Validadores internos ricos: fora da caixa, a Eskema tem cheques para tipos, números, strings, listas, mapas, etc. Por exemplo, ISSTRING (), ISINT (), ISEMAIL (), listEach (), listisoflength () e muito mais. As verificações de presença (isNotNull (), IsNotEmpty (), ispresent ()) e verificações de comparação (ISGT (), Islte (), ISIN (), etc.) também estão incluídas. Açúcar do operador: combine validadores com & (e) e | (Ou), e inverta com não (). Por exemplo, em vez de todos ([isString(), isNotEmpty()]), você pode simplesmente escrever $ ISSTRING & ISNOTEMPTY (). Você também pode substituir as mensagens de erro alinhadas pelo operador>, por exemplo, hasLength (5)> ‘deve ser 5 chars’. Semântica opcional vs nullável: por padrão, uma chave deve estar presente e não nulo. Use Nullable (Validator) para permitir que um campo seja nulo ou opcional (validador) para permitir que ele esteja ausente completamente. Isso ajuda a evitar a confusão comum entre “sem valor” e “valor nulo”. API do construtor: Se você preferir um estilo mais fluente e seguro, o Eskema oferece uma API do construtor. Por exemplo: final UserValidator = $ map (). Schema ({‘id’: $ string (). TRIM (). ToIntStrict (). Gt (0), ‘email’: $ String (). TRIM (). ToLowerCase (). Email (), ‘AGE’: $ String () ToIntstrict (). GTE (18). Digite o modo de saída de tela cheia de saída de tela cheia sem código – Todo o tempo de execução: o Eskema valida mapas e valores de dardo simples em tempo de execução. Sem etapas de construção, sem classes geradas. Pronto de produção: totalmente testado, documentado e com mensagens de erro sensíveis. As falhas produzem uma lista estruturada de expectativas (mensagem, caminho de campo, etc.), não apenas um bool. Functional Validation Examples Here’s a validator for a user object using the functional API: final userSchema = eskema({ ‘username’: isString() & isNotEmpty(), ‘password’: isString() & hasLength(8, 32), ‘email’: isString() & isEmail(), ‘signupDate’: optional(isDateTime()), }); Resultado final = usuárioschema.validate ({‘nome de usuário’: ‘alice’, ‘senha’: ‘secret123’, ‘email’: ‘alice@example.com’, // SignUpdate omitido está ok (opcional)}); if (! result.isValid) {print (resultado.expectations); } Digite o modo de saída do modo de tela full, cada campo mapeia para um validador. Combinamos cheques com e em vez de escrever tudo ([…]), e usado opcional (isDateTime ()) para permitir que o SignUpDate esteja ausente. O objeto de resultado possui .IsValid e. Expectações com informações detalhadas de erro. Se você precisar validar apenas um único valor: Final isNonEmntTr = Isstring () & isNotEmpty (); print (isNonemptystr.isValid (‘hello’)); // True Print (isNonemptystr.Validate (”). IsValid); // false, insira o modo de tela cheia de tela cheia de escrita de tela cheia, os validadores personalizados também são fáceis: validador iseven = validator ((valor) {resultado de retorno (isValid: valor é int && value % 2 == 0, esperado: ‘uniforme inteiro’,);}); Digite o modo de saia completa do modo de tela cheia antes do VS After Eskema Vamos ser honestos: todos nós escrevemos código de validação como este em algum momento: // antes: clássico se/else sopa bool validuser (mapa usuário) {if (usuário[‘username’] == null || usuário[‘username’] é! String || usuário[‘username’].isempty) {return false; } if (usuário[‘password’] == null || usuário[‘password’] é! String) {return false; } if ((usuário[‘password’] como string) .Length < 8 || (user[‘password’] as String).length > 32) {return false; } if (usuário[‘email’] == null || usuário[‘email’] é! String) {return false; } email final = usuário[‘email’] como string; Final emailRegex = regexp (r ‘^[^@]+@[^@]+\.[^@]+’); if (! EmailRegex.hasmatch (email)) {return false; } retornar true; } Digite o modo de saída do modo de tela cheia não apenas isso é detalhado, mas é quebradiço: difícil de estender, difícil de ler e fácil de errar. Agora, aqui está a mesma lógica expressa com Eskema: // depois: Eskema Final UsersChema = Eskema ({‘Nome de usuário’: Isstring () & isNotEmpty (), ‘senha’: Isstring () & HasLength (8, 32), ‘Email’: ISSTRING () e ISEMAIL (),}); Resultado final = usuárioschema.validate ({‘nome de usuário’: ‘Alice’, ‘senha’: ‘secret123’, ‘email’: ‘alice@example.com’,}); impressão (resultado.isvalid); // TRUE Digite o modo de tela de tela cheia de saída de tela cheia limpa, declarativa e composta. Em vez de fazer malabarismos com as verificações se/else e regex, você apenas descreve o que espera – e a Eskema cuida do resto. Usando o construtor para aqueles que gostam de uma abordagem fluente e ideal para o IDE, a API do construtor da Eskema fornece um poder de método de método: Observe que tudo é um validador, para que você possa combinar e compor validadores funcionais e construtores. Final MapValidator = $ map (). Schema ({‘id’: $ String (). TRIM (). ToIntStrict (). Gt (0), ‘tags’: $ list (). cada ($ string ()). comprimento (1),}); // Uso: final res = mapValidator.validate ({‘id’: ’42’, ‘tags’: [‘dart’, ‘eskema’]}); print (res.isvalid); // TRUE Digite o modo de saída do modo de tela cheia Isso produz o mesmo resultado que os validadores manuais, mas em uma sintaxe fluente. A vantagem reside na ergonomia: IDE Coimpletion, segurança do tipo e a eliminação da necessidade de importar inúmeras funções gratuitas. A ergonomia e as dicas usam os atalhos de $: muitos validadores zero-ARG têm um pseudônimo em cache. Por exemplo, $ ISSTRING é um ISSTRING () pré-construído. Parece limpo e evita re-alocar funções. Use ISSTRING () se você deseja especificar uma mensagem de erro personalizada. Sobrecarga do operador: Fique confortável com &, | e não (). Eles tornam os esquemas mais lógicos e mais lógicos de ler. Mensagens de erro claro: Use> para substituir as mensagens, por exemplo, HasLength (5)> Expectativa (…). Sem caldeira: funciona fora da caixa para formulários de vibração, manipuladores de API, arquivos de configuração – em qualquer lugar que você precise de validação. Suporte assíncrono: Precisa de verificações assíncronas? Basta usar .Validateasync (). A Eskema promoverá os validadores para assíncronos, conforme necessário. Conclusão Eskema tira a dor de cabeça da validação de tempo de execução, fornecendo um kit de ferramentas simples e flexível. É pequeno em escopo, mas grande em composibilidade. Você pode validar JSON, listas ou valores individuais aninhados com uma sintaxe clara e relatórios de erro ricos – tudo sem código ou cerimônia. Se o seu aplicativo lidar com dados dinâmicos, experimente a Eskema. Alguns validadores ergonômicos podem apenas salvá-lo de um mundo de bugs de arestas-e talvez até um pouco de desespero de codificação. 👉 Dê um giro: Eskema no Github. Seu futuro eu (e seus companheiros de equipe) agradecerá. ”

Fonte

Você pode ter perdido