Boxenn::UseCase
中处理 validation?dry-monads 中有提供 validate 的功能,他的特色是不会中断执行,而是等到所有 list 中的 validate 都执行完後再一次回传所有的 failure。
# create_order.rb
class ValidOrder < Boxenn::UseCase
option :repo, default: -> { OrderRepository.new }
def steps(serial_number:)
order = retrieve_order(serial_number)
yield List::Validated[
valid_capacity(order),
valid_price(order),
].traverse.to_result
Success()
end
private
def retrieve_order(serial_number)
repo.find_by_identity(serial_number: serial_number)
end
def valid_capacity(order)
return Invalid(:capacity_error) if order.capacity < 0
Valid(Unit)
end
def valid_price(order)
return Invalid(:price_error) if order.price < 0
Valid(Unit)
end
end
result = ValidOrder.new.call(serial_number: 'ABC-1234567890')
# 成功
# => Success()
# 失败
# => Failure(List[:capacity_error, :price_error])
这样的特性用在参数的 validation 很方便,但会有一些问题产生:
List
物件(dry-monads 自定义的),而在未使用 List::Validated
的 use case 中不会特别在 failure 回传 List
,使得介面不统一。List::Validated
当中的 method 全部都会执行,如果其中一个 method 执行失败,後续仍会继续执行,这与原本 use case 设计理念中的 sequential 性质有些违背。下篇会来聊聊 Boxenn::UseCase
目前的 error handling ,以及遇到的阻碍。
<<: D23 - 彭彭的课程# Python 网路连线程序、公开资料串接(1)
Covid-19、Delta疫情接连来袭对各方产业都造成了一定的冲击,在如此艰难的时刻里,仍然有一些...
GitHub 网址:https://github.com/ Heroku 网址:https://w...
今天来记录一个简单的概念sizeof,sizeof可以帮助计算型态, 结构体, 与阵列, 与指标的大...
API routes Next.js 是一个全端框架,除了提供 SSR 与 SSG 的功能之外,还能...