我有一个示例结构:
defmodule Foo do
@enforce_keys [:title, :description]
defstruct @enforce_keys
end
如果我在使用
Kernel.struct!/2
时创建一个没有键之一的结构,我会得到一个 ArgumentError:
attributes = %{description: "Lorem ipsum dolor..."}
struct!(Foo, attributes)
** (ArgumentError) the following keys must also be given when building struct Foo: [:title]
有没有办法让我在
rescue
ingArgumentError
时获得丢失的钥匙列表
try do
attributes = %{description: "Lorem ipsum dolor..."}
a = struct!(Foo, attributes)
rescue
ArgumentError ->
# Can I get [:title]?
我想创建自己的错误消息以传回给用户,即。 “您必须提供以下内容:标题,...”
我唯一想做的就是将传递给
&2
的地图键(Kernel.struct/2
)与@enforce_keys
模块的Foo
属性进行比较(使用函数公开)
defmodule Foo do
@enforce_keys [:title, :description]
defstruct @enforce_keys
def required_keys, do @enforce_keys
end
和
try do
attributes = %{description: "Lorem ipsum dolor..."}
a = struct!(Foo, attributes)
rescue
ArgumentError ->
Foo.required_keys -- Map.keys(attributes)
有更好的方法吗?