如何在compojure.api.sweet中实现自定义的强制转换?
我正在使用compojure.api.sweet实现一个端点:
(defroutes http-routes
(context "/shifts" []
(POST "/" []
:body [doc Shift]
(create-shift doc))))
Shift是一个模式(schema):
(defschema Shift
{:start Datetime
:end Datetime
(s/optional-key :breaks) [{:start Datetime
:end Datetime}]})
Datetime是一个传入的字符串,我想把它转换为java.time.ZonedDateTime对象。据说可以使用coercion来实现,但在文档中我还没弄清楚如何操作。欢迎提出建议。
解决方案
下面给出一种解决方案:
(ns your.namespace
(:require
[schema.core :refer [Schema]]
[schema.spec.core :refer [CoreSpec]]
[schema.utils :refer [->ErrorContainer]])
(:import [java.time ZonedDateTime]
[java.time.format DateTimeParseException]))
(deftype DatetimeCoreSpec []
CoreSpec
(subschemas [_]
[])
(checker [_ _]
(fn [v]
(try
(ZonedDateTime/parse v)
(catch DateTimeParseException _e
(->ErrorContainer v))))))
(def DatetimeSpec (->DatetimeCoreSpec))
(deftype DatetimeSchema []
Schema
(spec [_]
DatetimeSpec)
(explain [_]
'Datetime))
(def Datetime (->DatetimeSchema))
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。