Exposing compile-time data at runtime
As we left off in the previous section, exposing annotation data outside of the type itself can be a good way to keep things less coupled. This concept focuses on defining a struct that represents the parameters of the related annotation, along with other metadata related to the item the annotation was applied to.
If the struct representing the annotation's data has required parameters that are expected to be provided via the annotation, the program would not compile if those values were not provided. It also handles the case where the parameters have a default value. Additionally, if there is an unexpected field on the annotation, or an argument was not of the correct type, it would not compile either. This makes adding/removing properties from the struct far easier as they do not need to all be explicitly set within a StringLiteral
.
There is currently a Crystal RFC that proposes making this pattern more of a built-in feature by making...