# uneidel/ioddengine architecture

> Architecture diagram of the GitHub repository uneidel/ioddengine, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/uneidel/ioddengine
- Repository: https://github.com/uneidel/ioddengine

## Overview

IODD Engine is a Rust toolkit for loading IO-Link device descriptions, interpreting and encoding process data, browsing device menus, and interacting with IFM IoTCore masters. Its workflow runs from CLI or library input through catalog lookup and XML parsing, then uses the parsed device model to decode values or resolve menus; encoding supports writing values back. The README also documents direct parameter access and multilingual text. Some CLI-to-library links are documented rather than visible in sampled handler source, so those edges cite the README.

Main entry points: [`ioddengine/src/engine.rs`](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/engine.rs) (Data Engine), [`ioddcli/src/main.rs`](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/main.rs) (CLI Dispatcher), [`ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs`](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs) (Device Functions), [`ioddcli/src/functions/eval.rs`](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/eval.rs) (Live Evaluation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI"]
  node_cli_entry["CLI Dispatcher<br/>[main.rs]"]
  node_eval["Live Evaluation<br/>[eval.rs]"]
  node_parse_cli["Parse Commands<br/>[parse.rs]"]
  node_variable_cli["Variable Commands<br/>[variable.rs]"]
  node_menu_cli["Menu Commands<br/>[menu.rs]"]
  node_parameter_cli["Parameter Commands<br/>[parameter.rs]"]
end

subgraph group_core["IODD Core"]
  node_catalog["IODD Catalog<br/>[catalog.rs]"]
  node_parser["XML Parser<br/>[parser.rs]"]
  node_engine["Data Engine<br/>[engine.rs]"]
  node_decoder["PD Decoder<br/>[decoder.rs]"]
  node_encoder["Value Encoder<br/>[encoder.rs]"]
  node_standards["Standards Data<br/>[mod.rs]"]
  node_text["Language Text"]
end

subgraph group_device["Device Access"]
  node_iot_client["IoTCore Client<br/>[iotcoreclient.rs]"]
end

subgraph group_schema["IODD Model"]
  node_device_model["Device Description<br/>[IODevice.rs]"]
  node_device_function["Device Functions<br/>[DeviceFunction.rs]"]
  node_process_data["Process Data Schema"]
  node_variables["Variable Schema"]
  node_menus["Menu Schema<br/>[MenuCollection.rs]"]
end

node_user(("User"))
node_finder["IODD Finder"]
node_master["IFM IoTCore Master"]

node_user -->|"invokes"| node_cli_entry
node_cli_entry -->|"dispatches"| node_eval
node_cli_entry -->|"dispatches"| node_parse_cli
node_cli_entry -->|"dispatches"| node_variable_cli
node_cli_entry -->|"dispatches"| node_menu_cli
node_cli_entry -->|"dispatches"| node_parameter_cli
node_user -->|"requests device"| node_catalog
node_catalog -->|"queries"| node_finder
node_catalog -->|"provides files"| node_parser
node_parser -->|"parses into"| node_device_model
node_parser -->|"loads languages"| node_text
node_device_model -->|"contains schema"| node_device_function
node_device_function -->|"defines"| node_process_data
node_device_function -->|"defines"| node_variables
node_device_function -->|"defines"| node_menus
node_eval -->|"decodes data"| node_engine
node_engine -->|"calls"| node_decoder
node_engine -->|"uses"| node_standards
node_engine -->|"resolves menus"| node_menus
node_variable_cli -->|"encodes values"| node_engine
node_engine -->|"implements encoding"| node_encoder
node_menu_cli -->|"browses menus"| node_engine
node_eval -->|"reads live data"| node_iot_client
node_parameter_cli -->|"reads and writes"| node_iot_client
node_iot_client -->|"HTTP requests"| node_master

click node_cli_entry "https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/main.rs"
click node_eval "https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/eval.rs"
click node_parse_cli "https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/parse.rs"
click node_variable_cli "https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/variable.rs"
click node_menu_cli "https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/menu.rs"
click node_parameter_cli "https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/parameter.rs"
click node_catalog "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/catalog.rs"
click node_parser "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/parser.rs"
click node_engine "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/engine.rs"
click node_decoder "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/utils/decoder.rs"
click node_encoder "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/utils/encoder.rs"
click node_standards "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/standards/mod.rs"
click node_text "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ExternalTextCollection.rs"
click node_device_model "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/IODevice.rs"
click node_device_function "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs"
click node_process_data "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/ProcessDataCollection.rs"
click node_variables "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/VariableCollection.rs"
click node_menus "https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/MenuCollection.rs"
click node_iot_client "https://github.com/uneidel/ioddengine/blob/main/iotcoreconnect/src/iotcoreclient.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli_entry,node_eval,node_parse_cli,node_variable_cli,node_menu_cli,node_parameter_cli,node_user toneBlue
class node_catalog,node_parser,node_engine,node_decoder,node_encoder,node_standards,node_text toneAmber
class node_iot_client toneMint
class node_device_model,node_device_function,node_process_data,node_variables,node_menus toneRose
class node_finder,node_master toneIndigo
```

## Components

### CLI

- [CLI Dispatcher](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/main.rs): `ioddcli/src/main.rs`
- [Live Evaluation](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/eval.rs): `ioddcli/src/functions/eval.rs`
- [Parse Commands](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/parse.rs): `ioddcli/src/functions/parse.rs`
- [Variable Commands](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/variable.rs): `ioddcli/src/functions/variable.rs`
- [Menu Commands](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/menu.rs): `ioddcli/src/functions/menu.rs`
- [Parameter Commands](https://github.com/uneidel/ioddengine/blob/main/ioddcli/src/functions/parameter.rs): `ioddcli/src/functions/parameter.rs`

### IODD Core

- [IODD Catalog](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/catalog.rs): `ioddengine/src/catalog.rs`
- [XML Parser](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/parser.rs): `ioddengine/src/parser.rs`
- [Data Engine](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/engine.rs): `ioddengine/src/engine.rs`
- [PD Decoder](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/utils/decoder.rs): `ioddengine/src/utils/decoder.rs`
- [Value Encoder](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/utils/encoder.rs): `ioddengine/src/utils/encoder.rs`
- [Standards Data](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/standards/mod.rs): `ioddengine/src/standards/mod.rs`
- [Language Text](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ExternalTextCollection.rs): `ioddengine/src/ioddmodel11/ExternalTextCollection.rs`

### Device Access

- [IoTCore Client](https://github.com/uneidel/ioddengine/blob/main/iotcoreconnect/src/iotcoreclient.rs): `iotcoreconnect/src/iotcoreclient.rs`

### IODD Model

- [Device Description](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/IODevice.rs): `ioddengine/src/ioddmodel11/IODevice.rs`
- [Device Functions](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs): `ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs`
- [Process Data Schema](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/ProcessDataCollection.rs): `ioddengine/src/ioddmodel11/ProfileBody/ProcessDataCollection.rs`
- [Variable Schema](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/VariableCollection.rs): `ioddengine/src/ioddmodel11/ProfileBody/VariableCollection.rs`
- [Menu Schema](https://github.com/uneidel/ioddengine/blob/main/ioddengine/src/ioddmodel11/ProfileBody/MenuCollection.rs): `ioddengine/src/ioddmodel11/ProfileBody/MenuCollection.rs`

### Other components

- **User**
- **IODD Finder**
- **IFM IoTCore Master**

## Connections

- User → CLI Dispatcher: invokes
- CLI Dispatcher → Live Evaluation: dispatches
- CLI Dispatcher → Parse Commands: dispatches
- CLI Dispatcher → Variable Commands: dispatches
- CLI Dispatcher → Menu Commands: dispatches
- CLI Dispatcher → Parameter Commands: dispatches
- User → IODD Catalog: requests device
- IODD Catalog → IODD Finder: queries
- IODD Catalog → XML Parser: provides files
- XML Parser → Device Description: parses into (evidence: `ioddengine/src/parser.rs`)
- XML Parser → Language Text: loads languages (evidence: `ioddengine/src/parser.rs`)
- Device Description → Device Functions: contains schema (evidence: `ioddengine/src/ioddmodel11/IODevice.rs`)
- Device Functions → Process Data Schema: defines (evidence: `ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs`)
- Device Functions → Variable Schema: defines (evidence: `ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs`)
- Device Functions → Menu Schema: defines (evidence: `ioddengine/src/ioddmodel11/ProfileBody/DeviceFunction.rs`)
- Live Evaluation → Data Engine: decodes data
- Data Engine → PD Decoder: calls (evidence: `ioddengine/src/engine.rs`)
- Data Engine → Standards Data: uses (evidence: `ioddengine/src/engine.rs`)
- Data Engine → Menu Schema: resolves menus (evidence: `ioddengine/src/engine.rs`)
- Variable Commands → Data Engine: encodes values
- Data Engine → Value Encoder: implements encoding (evidence: `ioddengine/src/utils/encoder.rs`)
- Menu Commands → Data Engine: browses menus
- Live Evaluation → IoTCore Client: reads live data
- Parameter Commands → IoTCore Client: reads and writes
- IoTCore Client → IFM IoTCore Master: HTTP requests
