@0x8c2f829df1930cd5;

using CSharp = import "programming_language/csharp.capnp";
$CSharp.namespace("FabAccessAPI.Schema");

using import "persistent.capnp".Persistent;
using import "notify.capnp".Notifyable;
using import "interest.capnp".Interestable;
using import "claim.capnp".Claimable;
using import "claim.capnp".Lockable;

using import "utils.capnp".OID;
using import "utils.capnp".L10NString;

interface Resource extends (Persistent) {
    # BFFH's smallest unit of a physical or abstract "thing".  A resource can be as simple and
    # physical as a table, as complex as a PCB production line or as abstract as "people with
    # specific know-how are present".

    describe @0 () -> Description;
    # Return information about this resource.  This information is usually rather static, but may
    # change between calls.

    caps @1 () -> ( notify :Notifyable, interest :Interestable, claim :Claimable, lock :Lockable );
    # return the capabilities an user has for this resource.
    # `notify`: NULL if the user does not have permission to read this resource, or if this resource
    #           is not notifiable
    # `interest`: NULL if this resource is not interestable or the user does not have permission to
    #             set interests for this resource.
    # `claim`: NULL if the user does not have permission to write to this resource, or if this
    #          resource type does not support claiming.
    # `lock`: NULL if the user does not have permission to manage this resource, or if this resource
    #         type does not support claiming or locking.
}

struct Description {
    types @0 :List(OID);
    # The 'type' of Resource.  Each OID in the list specifies certain behaviours that this Resource
    # follows.

    urn @1 :Text;
    # The URN of this resource.

    category @2 :Text;
    # A category this resource belongs to.  If a resource was not assigned a category this is NULL.

    name @3 :L10NString;
    # A human-facing name for this resource.  A name should be short and recognizable, and is meant
    # as the primary identifier for users to find a resource.

    description @4 :L10NString;
    # A human-facing description for this resource.  Descriptions are longer-form text that give
    # additional information about a resource beyond a name.  They are meant to provide either
    # further identifying information or important information that users should be actively shown
    # when selecting this resource.

    wiki @5 :Text;
    # An URI to further detailed information about this resource, e.g. in a wiki.  This SHOULD be an
    # http or https URL.
}