Skip to main content

CAD013: Metadata

Overview

The CVM provides a powerful facility for attaching a metadata map to a defined symbol. The purpose of metadata is to provide any information on a defined symbol independent of the value this symbol holds.

Some metadata information, if specified, MUST follow a particular structure for external purposes. For instance, this CAD describes how to document a symbol by following an expected structure.

Other information in metadata CAN follow any arbitrary structure. Creators of such SHOULD collaborate with the community to establish useful standards where appropriate (which may include updates to this CAD)

Usage

Declaring metadata

Metadata is a map containing any arbitrary set of key-values. It is specified after the defined symbol, prefixed with ^:

(def some-symbol
^{:my ["meta" :data]}
42)

Retrieving metadata

The core library defines a function for retrieving metadata:

(lookup-meta 'some-symbol)

;; Following previous example, returns `{:my ["meta" :data]}`

Each account stores a map of symbol to metadata map under :metadata:

(get (account *address*)
:metadata)

;; Following previous examples, returns `{'some-symbol {:my ["meta" :data]}}`

Standard structures

For some purposes, metadata must follow at least a set of contraints so that the CVM or any external consumer has access to relevant information.

Documentation

Attaching documentation to a symbol allows any user to gain insight about the purpose of that symbol. Notably, it can provide information regarding how a function is intended to be used and why.

User MAY specify any information as described below. None is mandatory. When specified, structure MUST conform as expected by any external consumer.

A documentation map MAY be attached to metadata under :doc.

Reference example:

(defn add

^{:doc {:description "Adds 2 numbers together."
:errors {:CAST "If an argument cannot be cast to a number"}
:examples [{:code "(add 2 3)"}]
:signature [{:params [a b]
:returns Number}]
:type :function}}

:implementation...)

Documentation map MAY contain any of the key-values described in the following subsections.

:description

String describing the symbol in human language .

TODO. Also a vector of strings where each string is a paragraph for easier formatting?

:errors

Assuming the symbol is callable, map of error code to string describing in human language how and why calling this function might fail.

See also CAD 011 about errors.

:examples

Assuming the symbol is callable, vector of examples where an example is a map which MAY contain:

KeyValue
:codeString, excerpt of code demonstrating a function call

TODO. Should it be a string? Is it for memory issues? TODO. Should it also have a :return key-value?

:signature

Assuming the symbol is callable, vector of signatures where a signature is a map which MAY contain:

KeyValue
:paramsVector of parameters
:returnsType of returned value

TODO. Is there a list of supported types for :returns? More future-proof to have a human-readable string?

:type

Keyword designating what category the symbol belongs to:

KeywordMeaning
:functionSymbol is a regular function
:macroSymbol is a macro

TODO. What about other values?

Expanders

As described in CAD 009, expanders MUST have at least {:expander true} in their metadata.

TODO. Use :expander? for consistency.

TODO. Example here? Or rather in CAD009?

TODO. Other sections besides documentation and expanders?