首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用直线/模式生成用户友好的验证消息?

如何使用直线/模式生成用户友好的验证消息?
EN

Stack Overflow用户
提问于 2018-03-09 13:23:51
回答 1查看 846关注 0票数 3

我希望能够为这些模式中的验证错误生成对用户友好的或指定自定义错误消息:

代码语言:javascript
复制
(def Uuid (s/constrained String #(re-matches #"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" (name %))))
(def FirstName s/Str)
(def LastName s/Str)

(s/defschema Person {(s/required-key :id)         Uuid,
                     (s/required-key :first-name) FirstName,
                     (s/required-key :last-name)  LastName})

有效模式:

代码语言:javascript
复制
{
 :uuid "e143499c-1257-41e4-b951-c9e586994ff9" 
 :first-name "john" 
 :last-name "smith"
}

无效架构:

代码语言:javascript
复制
{
 :uuid "" 
 :first-name nil 
 :last-name nil
}

无效模式-错误:

代码语言:javascript
复制
{
 "id" : "(not (app.person/fn--4881 \"\"))",
 "first-name" : "(not (instance? java.lang.String nil))"
 "last-name" : "(not (instance? java.lang.String nil))"
}

我希望能够为非程序员生成一些更易读的内容,例如:

代码语言:javascript
复制
{
 "id" : "invalid uuid",
 "first-name" : "must be a string"
 "last-name" : "must be a string"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-09 16:07:37

有趣的是,这正是几天前作为图书馆发布的。

请参见:

https://github.com/siilisolutions/humanize

首先,您还需要标记您的Uuid模式,以便以后可以匹配它:

代码语言:javascript
复制
;; Note the last param I added: 
(def Uuid (sc/constrained
            String
            #(re-matches #"^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
                         (name %))
            'UUID))

(require '[schema.core :as sc]
         '[humanize.schema :as hs])

(#'hs/explain (sc/check Person {:id "foo"
                                :first-name "foo"
                                :last-name 3})
  (fn [x]
    (clojure.core.match/match
      x
      ['not ['UUID xx]]
      (str xx " is not a valid UUID")

      :else x)))

在以下方面的成果:

代码语言:javascript
复制
=> {:id "foo is not a valid UUID", :last-name "'3' is not a string but it should be."}

注意,它需要一个小技巧,因为不幸的是hs/explain是私有的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49194814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档