# Using the RustRust crates Beyond the CLI, you can integrate Firm's core logic directly into your own software using the `firm_core` and `firm_lang` Rust packages. This allows you to build automations and tools on top of Firm. ## Adding dependencies First, add the Firm crates to your `Cargo.toml`: ```toml [dependencies] firm_core = { git = "https://github.com/42futures/firm.git" } firm_lang = { git = "https://github.com/42futures/firm.git" } ``` ## Basic usage Here's an example of loading a workspace and querying the entity graph: ```rust,no_run use firm_lang::workspace::Workspace; use firm_core::EntityGraph; fn main() -> Result<(), Box> { // Load workspace from a directory let mut workspace = Workspace::new(); workspace.load_directory("./my_workspace")?; let build = workspace.build()?; // Build the graph from the workspace entities let mut graph = EntityGraph::new(); graph.add_entities(build.entities)?; graph.build(); // Query the graph for a specific entity let lead = graph.get_entity(&EntityId::new("lead.ai_validation_project"))?; println!("Found lead: {:?}", lead); Ok(()) } ``` ## Working with references You can traverse relationships and access field values: ```rust,no_run use firm_core::{EntityId, FieldId}; // Get an entity let lead = graph.get_entity(&EntityId::new("lead.ai_validation_project"))?; // Get a field value let contact_ref = lead.get_field(FieldId::new("contact_ref"))?; // Resolve the reference to another entity let contact = contact_ref.resolve_entity_reference(&graph)?; println!("Contact: {:?}", contact); ``` ## Creating entities programmatically You can create entities in code: ```rust,no_run use firm_core::{Entity, EntityId, EntityType, FieldId, FieldValue}; let person = Entity::new( EntityId::new("john_doe"), EntityType::new("person") ) .with_field(FieldId::new("name"), FieldValue::String("John Doe".to_string())) .with_field(FieldId::new("email"), FieldValue::String("john@example.com".to_string())); // Add to the graph graph.add_entity(person)?; ``` ## Generating DSL You can also generate DSL from entities: ```rust,no_run use firm_lang::generate::generate_dsl; let dsl = generate_dsl(&entity)?; println!("{}", dsl); ``` This outputs: ```firm person john_doe { name = "John Doe" email = "john@example.com" } ```