diameter_make(3)
π diameter_make(3) π
okay bestie, this is an Erlang Module Definition β the Diameter dictionary compilation one. buckle up, it's actually iconic π
β¨ NAME β¨
diameter_make β Diameter dictionary compilation, fr fr π¦
πΈ DESCRIPTION πΈ
so codec/2 is the function that takes a diameter dictionary file and compiles it into Erlang source. and like, that resulting source? it implements the interface diameter needs to encode and decode the dictionary's messages and AVPs. no cap, that's the whole job π
also there's a utility called diameterc(1) which gives you an alternate compilation interface, if that's more your vibe.
π BUGS π
Unrecognized options are silently ignored. literally they just ghost you. π
π SEE ALSO π
π DATA TYPES π
dict() :: iolist() | binary() | parsed().
opt() ::
{include | outdir | name | prefix | inherits, string()} |
return | verbose | parse | forms | erl | hrl.
parsed() :: list().
like yes, parsed() is just a list. it's giving simplicity. it's giving ate. π
π₯ FUNCTIONS π₯
β codec(File, [opt()]) -> ok | {ok, list()} | {error, Reason}
when
File :: dict() | {path, file:name_all()},
Reason :: string().
Compile a single dictionary file. one file. that's it. slay β¨
The input File can be either a path or a literal dictionary β and the way you tell them apart? the occurrence of newline (ascii NL) or carriage return (ascii CR) is what identifies the literal dictionary one. sneaky but valid π
Opt determines the format of the results and whether they get written to file or returned to you, and it can have the following types:
parse | forms | erl | hrlβ Specifies an output format. Whether the output is returned or written to file depends on whether or not optionreturnis specified. When written to file, the resulting file(s) will have extensions.D,.F,.erl, and.hrlrespectively, basenames defaulting todictionaryif the input dictionary is literal and does not specify@name. When returned, results are in the order of the corresponding format options. Format options default toerlandhrl(in this order) if unspecified.- The
parseformat is an internal representation that can be passed toflatten/1andformat/1, while theformsformat can be passed tocompile:forms/2. Theerlandhrlformats are returned as iolists. π«Ά
- The
{include, string()}β Prepend the specified directory to the code path. Use this to point at beam files compiled from inherited dictionaries β@inheritsin a dictionary file creates a beam dependency, not an erl/hrl dependency. lowkey important.- Multiple
includeoptions can be specified. stack 'em up π§
- Multiple
{outdir, string()}β Write generated source to the specified directory. Defaults to the current working directory. Has no effect if optionreturnis specified. (like, why would it, bestie)returnβ Return results in a{ok, [Out]}tuple instead of writing to file and returningok. the "hand it to me directly" option π{name|prefix, string()}β Transform the input dictionary before compilation, setting@nameor@prefixto the specified string.{inherits, string()}β Transform the input dictionary before compilation, appending@inheritsof the specified string.- Two forms have special meaning:
{inherits, "-"}
{inherits, "Prev/Mod"}
- The first has the effect of clearing any previous inherits, the second of replacing a previous inherits of
Prevto one ofMod. This allows the semantics of the input dictionary to be changed without modifying the file itself. iconic behavior tbh πΈ - Multiple
inheritsoptions can be specified.
indirect_inheritsβ This option makes compiler support automatic recursive inheritance. When a dictionary file inherits another.dia, all ancestors of that.diawill also be considered in code generation. This enhancement removes the requirement to explicitly list all parent dictionaries via@inherits, preventing missing AVP/message encodings and runtime errors. π₯- Example:
C.diainheritsB.diaandB.diainheritsA.dia. - Before (without
indirect_inherits): IfC.diareferences AVPs fromA.diawithout directly inheriting it, the generated code will lack necessary definitions, causing encoding failures. π - After (with
indirect_inherits):C.diacan reference AVPs fromA.diawithout directly inheriting it, compiler will resolve the entire inheritance chain automatically, ensuring all relevant descendant definitions fromA.diaare available without additional user declarations. periodt. π
- Example:
Note that a dictionary's@name, together with theoutdiroption, determine the output paths when thereturnoption is not specified. The@nameof a literal input dictionary defaults todictionary.
A returned error reason can be converted into a readable string using format_error/1. π
π¦ flatten(parsed()) -> parsed().
Reconstitute a parsed dictionary, as returned by codec/2, without using @inherits. That is, construct an equivalent dictionary in which all AVP's are definined in the dictionary itself. The return value is also a parsed dictionary. (yes bestie, "definined" β that's the original spelling, I don't make the rules π
)
β¨ format(parsed()) -> iolist().
Turns a parsed dictionary, as returned by codec/2, back into the dictionary format. it's giving reverse uno card π
π format_error(Reason) -> FormattedReason
when Reason :: term(), FormattedReason :: string().
Turn an error reason returned by codec/2 into a readable string. because raw error terms are not the vibe check you want at 3am π
π₯Ί okay that's the whole page, you made it, I'm so proud of you bestie. this was Ericsson AB's work, from diameter 2.7.2, and it's been sitting there being iconic since forever β go compile something cute πβ¨π
π¦ where this page comes from
- nixos 26.05: erlang 29.1.2
- nixpkgs unstable: erlang 29.1.2
- ubuntu stonking: erlang-doc 1:29.0.6+dfsg-1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms