| # Entities |
|
|
| Entities are the fundamental business objects in your workspace, like people, organizations, or projects. Each entity has a unique ID, a type, and a collection of fields. |
|
|
| ## Defining entities |
|
|
| **In the DSL**, you define an entity with its type and ID, followed by its fields in a block: |
|
|
| ```firm |
| person john_doe { |
| name = "John Doe" |
| email = "john@doe.com" |
| } |
| ``` |
|
|
| **In Rust**, this corresponds to an `Entity` struct: |
|
|
| ```rust,no_run |
| let person = Entity::new(EntityId::new("john_doe"), EntityType::new("person")) |
| .with_field(FieldId::new("name"), "John Doe") |
| .with_field(FieldId::new("email"), "john@doe.com"); |
| ``` |
|
|
| ## Entity structure |
|
|
| Every entity has: |
|
|
| - **Type**: What kind of entity this is (e.g., `person`, `organization`, `task`) |
| - **ID**: A unique identifier within its type (e.g., `john_doe`) |
| - **Fields**: Key-value pairs containing the entity's data |
|
|
| ## Composite entity identifier |
|
|
| When Firm works with entities, it assigns each one a composite identifier of its type and ID. This means you can have several entities with the same ID, as long as they have different types. |
|
|
| For example, you could have: |
| - `person.hello` - A person named Hello |
| - `organization.hello` - An organization called Hello |
|
|
| When referencing entities, Firm uses the format `type.id`: |
|
|
| - `person.john_doe` |
| - `organization.megacorp` |
| - `task.design_homepage` |
|
|