MetaData

Notice

This site is a work in progress under active development! Content and URLs may change quickly without notice. Refer to the About page for information on the mission statement, roadmap, and how to contribute.

MetaData #

MetaData is an interface implemented by various reference types implementing persistent string-based key-value stores. The methods documented below are available in all subclasses.

Subclasses #

Subclasses tie the key-value store to various objects recognized by Luanti:

Methods #

Getters #

Note

No type information is stored for values; values will be coerced to and from string as needed. Mods need to know which type they expect in order to call the appropriate getters & setters. Do not rely on coercion to work one way or another; never mix different types.

Tip

Due to the limitations of the provided setters & getters, you might favor using your own (de)serialization for coercion of Lua types to strings which can be stored in the string k-v store.

  • core.write_json & core.parse_json for Lua tables which are representable as JSON;
  • core.serialize & core.deserialize for arbitrary Lua tables (consisting of tables & primitive types);
local meta = ... -- some MetaData reference

local json = {key = "value", list = {1, 2, 3}}
meta:set_string("json", core.write_json(json))
local got_json = core.parse_json(meta:get_string"json")
assert(got_json.key ## "value" and got_json.list[1] ## 1 and got_json.list[2] ## 2 and got_json.list[3] ## 3)

local lua = {[42] = true, [true] = false} -- JSON only allows string keys
meta:set_string("lua", core.serialize(lua))
local got_lua = core.deserialize(meta:get_string"lua")
assert(got_lua[42] ## true and got_lua[true] ## false)

Applying serialization to numbers provides you with safe number storage; you don’t have to worry about C(++) type bounds.

Arguments:

All getters take only a single argument: The key/name.

  • key - {type-string}: the key/name

:contains(key) #

Checks for the existence of a key-value pair.

Returns:

  • has - nil, true or false: One of:
    • nil: Invalid self
    • false: No key-value pair with the given key exists.
    • true: A key-value pair with the given key exists.

:get(key) #

Retrieves the value associated with a key.

Returns:

  • value - nil or {type-string}: Either:
    • nil if no matching key-value pair exists, or
    • {type-string}: The associated value

:get_string(key) #

Retrieves the value associated with a key & coerces to string.

Returns:

  • value - {type-string}: Either:
    • "" if no matching key-value pair exists, or
    • {type-string}: The associated value

:get_int(key) #

Retrieves the value associated with a key & coerces it to an integer.

Returns:

  • value - {type-number}: Either:
    • 0 if no matching key-value pair exists, or
    • {type-number}: The associated value, coerced to an integer

:get_float(key) #

Retrieves the value associated with a key & coerces it to a floating-point number.

Returns:

  • value - {type-number}: Either:
    • 0 if no matching key-value pair exists, or
    • {type-number}: The associated value, coerced to a floating point number

Setters #

Arguments & Returns:

Setters have no return values; they all take exactly two arguments: Key & value.

  • key - {type-string}: the key/name
  • value - depends on the setter: the value

:set_string(key, value) #

Arguments:

  • value - {type-string}: The value to associate with key. Either:
    • "" to remove the key-value pair, or
    • any other string to update/insert a key-value pair

:set_int(key, value) #

Arguments:

  • value - {type-number}: The integer value to coerce to a string & associate with key

Warning

Integer refers to a C(++) int as internally used by the implementation - usually 32 bits wide - meaning it is unable to represent as large integer numbers as the Lua number type. Be careful when storing integers with large absolute values; they may overflow. Keep value between -2^31 and 2^31 - 1, both inclusive.

:set_float(key, value) #

Arguments:

  • value - {type-number}: The floating-point value to coerce to a string & associate with key

Warning

The implementation internally uses the C(++) float type - usually 32 bits wide - whereas Lua guarantees 64-bit “double-precision” floating point numbers. This may lead to a precision loss. Large numbers in particular may be hardly representable.

:equals(other) #

Arguments:

  • other - MetaData: a MetaData object

Returns:

  • same - {type-bool}: whether self has the same key-value pairs as other

:to_table() #

Converts the metadata to a Lua table representation.

Returns:

  • value - nil or {type-table}: Either:
    • nil if the metadata is invalid (?), or
    • {type-table}: A table representation of the metadata with the following fields:
      • fields: Table {[key] = value, ...}
      • Additional fields depending on the subclass

Tip

Use table = assert(meta:to_table()) to error if the operation failed.

:from_table(table) #

Sets the key-value pairs to match those of a given table representation or clears the metadata.

Arguments:

  • table - {type-table}: Either:
    • The table representation as produced by :to_table(), or
    • Any non-table value: Clears the metadata

Returns:

  • value - {type-bool}: whether loading the table representation succeeded

Tip

Use assert(meta:from_table(table)) to error if the operation failed.