Hello everyone,
I would like to propose an extension to defstruct that will require certain
fields to be given when expanding it. Here is an example:
defmodule User do
defstruct [age: nil], # optional
[name: nil] # required
end
With this feature, %User{} will fail as the :name field was not specified.
%User{name: "foo"} or %User{name: nil} will both work as expected. The main
use case is to make sure all important fields are set when building the
data. For example, we can use such fields in the new date time types to
enforce proper data representation.
*Extra notes*
1. The required fields are given as second argument to defstruct as the API
must remain backwards compatibility
2. The fields are required only when building structs. Matching will always
work without specifying any field, for example: %User{} = user
3. The Kernel.struct/2 function, used to build structs dynamically, won't
check for required keys. Kernel.struct!/2 should be used if you want to
check for required keys (and also check that no extra keys are given)
4. defexception will leverage the same functionality
*Implementation*
Implementation-wise, structs will now defined a __struct__/1 function,
besides the regular __struct__/0 function. It has not been decided yet how
such function will behave given it must work both for compile-time
(%User{}) and runtime (struct! User, %{}) checks.
*Feedback*
Now it is your turn. :)
*José Valim*
www.plataformatec.com.br
Skype: jv.ptec
Founder and Director of R&D
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4KYeJCq7u2iubGoNSnNS5y94o5Ju8_xs_n9PZ_Q1OTKRg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.