使用@enforce_keys 时从 ArgumentError 获取丢失的键

问题描述 投票:0回答:0

我有一个示例结构:

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
ing
ArgumentError

时获得丢失的钥匙列表
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)

有更好的方法吗?

elixir
© www.soinside.com 2019 - 2024. All rights reserved.