tree:

mask(tree, mask)

This returns the tree that results from applying the mask tree to the source tree, preserving only keys that exist in mask and have a truthy value.

See also tree:filter.

Example

Suppose mask.ori contains:

// mask.ori

mask(
  // Source tree
  {
    a: 1
    b: 2
    c: {
      d: 3
      e: 4
    }
  }
  // Mask tree
  {
    a: true
    c: {
      d: true
    }
  }
)

Invoking this returns the masked result:

$ ori mask.ori/
a: 1
c:
  d: 3

If the mask tree does not specify a value for a given key, the result of asking for that value will be undefined, which is a falsy value. This means it is not normally necessary to specify false values in the mask tree.

Above, b and c/e have been masked from the source tree because those do paths do not lead to truthy values in the mask tree.

Default value

You can influence the result of a mask operation by defining a default value for the mask tree using a shorthand function or tree:constant.

// maskDefault.ori
mask(
  {
    a: 1
    b: 2
    c: 3
    d: 4
  }
  {
    ...constant(true) // Default is to let values through the mask
    b: false
  }
)

The above defines a mask where the default value is true, so all keys and values in the source tree will come through the mask unless specifically overridden with a falsy value.

$ ori maskDefault.ori/
a: 1
c: 3
d: 4

This flips the logic of mask: instead of only allowing truthy values in, this mask excludes falsy values.

Mask with globs and regular expressions

You can use mask in conjunction with tree:globKeys and tree:regExpKeys.