In this case, I would call Keyword.validate! And then call Map.new. I don’t see a benefit in the generic API as it won’t be faster and not necessarily clearer either. So I would stick with my last proposal. :)
On Mon, Jul 26, 2021 at 20:01 Paulo Valente <polvale...@gmail.com> wrote: > I was considering making it only accept keywords, and return keywords as > well. > > However, I can see benefits in accepting Enumerables. What do you think > about using another verb such as cast or coerce, instead of validate, for > this typing > (e.g. @spec Keyword.cast!(Enumerable.t(), keyword) :: keyword | no_return > and @spec Map.cast!(Enumerable.t(), keyword) :: map | no_return)? > > Should I also implement it for Map as well, or maybe add it in a second PR? > > Thanks for the idea on Enumerables! > Em segunda-feira, 26 de julho de 2021 às 12:47:31 UTC-3, Wojtek Mach > escreveu: > >> Keyword.validate will accept just a keyword, right? Did you consider >> making it accept any enumerable of pairs, just like Keyword.new does? Same >> for Map. >> >> I think one particular scenario is something like this: >> >> def foo(opts) when is_list(opts) do >> config = Map.validate!(opts, …) >> config.name # the assertive map.key is really convenient here >> >> what do you think? The only concern, besides feature creep :), is perhaps >> validate is not the best name given it accepts broader set of inputs. But >> then again, Keyword.keyword and in particular Map.map are maybe a bit >> awkward. >> >> On July 26, 2021, josevalim <jose....@gmail.com> wrote: >> >> I debated this with the Elixir team and we agreed on the following API: >> Keyword.validate! :: keyword | no_return Keyword.validate :: {:ok, >> keyword} | {:error, unknown_keys, missing_keys} >> The same functionality would have to be defined for Map. >> The API for Keyword.validate! and Map.validate! would be the exact same >> as the one found in Nx.Defn.Kernel.keyword!. >> Could you please send a PR? Or open up an issue if you can't submit it at >> the moment. >> >> Thanks!On Monday, July 12, 2021 at 12:46:38 PM UTC+2 polva...@gmail.com >> wrote: >> >> > I would propose to add this to the Kernel module, to mirror the struct! >>> helper. But adding to Keyword also works. Thoughts? >>> >>> Makes sense! I suggested Keyword mostly because there's the module >>> already, but since we have struct! in Kernel, it might be better to have >>> keyword! there too. Usage would also be nicer this way. >>> >>> > Should the bang version really raise for redundant options? >>> >>> As José said, it would help clean out stray options being passed. I can >>> think of a few cases in which I thought one option was being used, but had >>> either a typo or wrong name altogether (think "end" vs "end_datetime" sort >>> of situation). >>> However, I can see a less strict version being useful as well. Perhaps >>> there could be a keyword!/3 which accepted options like: keyword!(opts, >>> [extra_keys: true], key1: :default1, key2: :default2) >>> >>> -- >> You received this message because you are subscribed to the Google >> Groups "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send >> an email to elixir-lang-co...@googlegroups.com. >> >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/elixir-lang-core/9b83a803-c2c1-49e7-a531-56791607bcaan%40googlegroups.com >> <https://groups.google.com/d/msgid/elixir-lang-core/9b83a803-c2c1-49e7-a531-56791607bcaan%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> -- > You received this message because you are subscribed to the Google Groups > "elixir-lang-core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to elixir-lang-core+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/elixir-lang-core/a96fb19a-8148-41dc-8b45-0e2b9fe755b8n%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/a96fb19a-8148-41dc-8b45-0e2b9fe755b8n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4JhEbMiv1gXDAbYVophOWx9eyHqa-NwwVPnNWK3Q2771A%40mail.gmail.com.