Enums
Enums are used for establishing a set of predefined constants, which can represent various states, types, or configurations within the library. Enums are embedded within a Runtime Entity Object and do not need any navigation through associations.
Typically, Enums are used to define the following:
- States: Enums can be used to define the state of an object, such as 
Active,Inactive,Pending, etc. - Configurations: Enums can be used to define configurations, such as 
High,Medium,Low, etc. - Status: Enums can be used to define the status of an object, such as 
Success,Failure,Pending, etc. - Categories: Enums can be used to define categories, such as 
Electronics,Clothing,Furniture, etc. - Permissions: Enums can be used to define permissions, such as 
Read,Write,Delete, etc. - Priority: Enums can be used to define priority levels, such as 
High,Medium,Low, etc. - Severity: Enums can be used to define severity levels, such as 
Critical,Major,Minor, etc. - Frequency: Enums can be used to define frequency, such as 
Daily,Weekly,Monthly, etc. - Direction: Enums can be used to define direction, such as 
Inbound,Outbound,Bidirectional, etc. 
Creating Enums
Create a YAML file and add the following content to define an Enum:
$schema: https://schemas.meshmakers.cloud/construction-kit-elements.schema.json
enums:
- enumId: Priority
  useFlags: false
  isExtensible: false
  values:
  - key: 1
    name: Low
    description: Low priority
  - key: 2
    name: Medium
    description: Medium priority
  - key: 3
    name: High
    description: High priority
The following table describes the fields in the Enum definition:
| Field | Description | Mandatory | Default Value | 
|---|---|---|---|
| enumId | The unique identifier for the Enum. | Yes | |
| useFlags | A boolean value that indicates whether the Enum should be used as flags. | No | false | 
| isExtensible | A boolean value that indicates whether the Enum is extensible using the API | No | false | 
| values | An array of key-value pairs that define the values of the Enum. | Yes | |
| key | The key for the Enum value. Must be a unique integer within the list | Yes | |
| name | The name of the Enum value. Must be a name without special characters or whitespaces | Yes | |
| description | The description of the Enum value. | No | 
Customization Extensions
Customization extensions are used to extend the values list of a predefined Enum.
This feature is useful for creating master data that does not change heavily. It is not recommended to use this feature for frequently changing data, because a full reload of the tenant is required to apply the changes.
The following example demonstrates how to extend the Priority Enum with a new value:
Step 1: Update the Enum definition to make it extensible
We create a new Enum definition for the Priority Enum with the isExtensible field set to true.
$schema: https://schemas.meshmakers.cloud/construction-kit-elements.schema.json
enums:
  - enumId: Priority
    useFlags: false
    isExtensible: true # This field is updated to true
    values:
      - key: 1
        name: Low
        description: Low priority
      - key: 2
        name: Medium
        description: Medium priority
      - key: 3
        name: High
        description: High priority
Step 2: Import the construction kit to OctoMesh
After updating the Enum definition, compile the construction kit and import it to OctoMesh. The Enum Priority is now extensible, and you can add new values to it using the API.
octo-cli -c importck -f '<path of directory for construction kit>' -w
See Importing Construction Kits for more information.
Step 3: Extend the Enum using the API
We crate a new value for the Priority Enum using the API called Urgent with the key 1. We use the INSERT operation to add the new value to the Enum.
mutation {
  constructionKit {
    enums(ckId: "ConstructionKitLibrary/Priority") {
      updateValueExtensions(
        values: [
          {
            operation: INSERT
            value: { key: 4, name: "Urgent", description: "Urgent priority" }
          }
        ]
      ) {
        ckEnumId
        isExtensible
        values {
          key
          name
          description
          isExtension
        }
      }
    }
  }
}
The result of this query is as follows
{
  "data": {
    "constructionKit": {
      "enums": {
        "updateValueExtensions": [
          {
            "ckEnumId": "ConstructionKitLibrary/Priority",
            "isExtensible": true,
            "values": [
              {
                "key": 1,
                "name": "Low",
                "description": "Low priority",
                "isExtension": false
              },
              {
                "key": 2,
                "name": "Medium",
                "description": "Medium priority",
                "isExtension": false
              },
              {
                "key": 3,
                "name": "High",
                "description": "High priority",
                "isExtension": false
              },
              {
                "key": 4,
                "name": "Urgent",
                "description": "Urgent priority",
                "isExtension": true
              }
            ]
          }
        ]
      }
    }
  }
}
Be aware of:
- The name must be unique within the Enum. If you try to insert a value with a name that already exists, the operation will fail.
 - The name must not be empty, contain special characters or whitespaces. Regex pattern: 
^[_a-zA-Z][_a-zA-Z0-9]*$ - The key must be unique within the Enum. If you try to insert a value with a key that already exists, the operation will fail.
 - The key must be an integer and greater than 0.
 
It is also possible to delete or update values of an Enum. The following example demonstrates how to delete and insert a value in the Priority Enum:
mutation {
  constructionKit {
    enums(ckId: "ConstructionKitLibrary/Priority") {
      updateValueExtensions(
        values: [
         {
            operation: DELETE
            value: { key: 4, name: "Urgent", description: "Urgent priority" }
          },
          {
            operation: INSERT
            value: { key: 4, name: "Critical", description: "Critical priority" }
          }
        ]
      ) {
        ckEnumId
        isExtensible
        values {
          key
          name
          description
          isExtension
        }
      }
    }
  }
}