# tsuitoar/visa-rs architecture

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

- Interactive diagram: https://gitdiagram.com/tsuitoar/visa-rs
- Repository: https://github.com/tsuitoar/visa-rs

## Overview

visa-rs provides safe Rust bindings for controlling VISA instruments through an installed native VISA library. The main workflow opens a resource manager, discovers a matching resource, opens an instrument session, then exchanges data; the README demonstrates this with a *IDN? query. The crate also exposes synchronous session, attribute, event and locking APIs, plus callback-based async I/O and a Tokio adapter. A companion procedural-macro crate generates enum and attribute definitions. Some runtime relationships are documented, but many implementation details are unsampled.

Main entry points: [`src/instrument.rs`](https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs) (Instrument session), [`src/lib.rs`](https://github.com/tsuitoar/visa-rs/blob/main/src/lib.rs) (Resource manager), [`visa-rs-proc/src/lib.rs`](https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/lib.rs) (Macro entry points), [`src/async_io/mod.rs`](https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/mod.rs) (Async instrument)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sessions["Sessions and I/O"]
  node_resource_manager["Resource manager<br/>[lib.rs]"]
  node_discovery["Resource discovery<br/>[lib.rs]"]
  node_instrument["Instrument session<br/>[instrument.rs]"]
  node_session_lifecycle["Session lifecycle<br/>[session.rs]"]
  node_sync_io["Synchronous I/O<br/>[instrument.rs]"]
  node_event_control["Event control<br/>[instrument.rs]"]
  node_callbacks["Event callbacks<br/>[handler.rs]"]
end

subgraph group_async["Async I/O"]
  node_async_instrument["Async instrument<br/>[mod.rs]"]
  node_async_callbacks["Completion callbacks<br/>[callback.rs]"]
  node_async_futures["Async futures<br/>[future.rs]"]
  node_tokio_adapter["Tokio adapter<br/>[async_tokio.rs]"]
end

subgraph group_domain["VISA Types"]
  node_attributes["Attributes<br/>[attribute.rs]"]
  node_events["Event types<br/>[event.rs]"]
  node_status["Status codes<br/>[status.rs]"]
  node_flags["Operation flags<br/>[flags.rs]"]
  node_enum_macros["Enum definitions<br/>[assert.rs]"]
end

subgraph group_macros["Code Generation"]
  node_proc_macros["Macro entry points<br/>[lib.rs]"]
  node_attribute_codegen["Attribute generator<br/>[mod.rs]"]
  node_attribute_ranges["Attribute ranges<br/>[range.rs]"]
  node_repr_codegen["Representation generator<br/>[repr.rs]"]
  node_identifier_rewrite["Identifier rewriting<br/>[rusty_ident.rs]"]
end

node_user(("Rust application"))
node_visa{{"VISA library"}}

node_user -->|"opens"| node_resource_manager
node_resource_manager -->|"finds resources"| node_discovery
node_resource_manager -->|"opens session"| node_instrument
node_user -->|"exchanges data"| node_sync_io
node_resource_manager -.->|"uses native API"| node_visa
node_instrument -.->|"uses native API"| node_visa
node_instrument -->|"owns session"| node_session_lifecycle
node_instrument -.->|"provides"| node_sync_io
node_instrument -.->|"provides"| node_event_control
node_event_control -->|"installs handler"| node_callbacks
node_user -->|"uses async I/O"| node_async_instrument
node_async_instrument -->|"registers completion"| node_async_callbacks
node_async_instrument -.->|"creates futures"| node_async_futures
node_async_futures -->|"uses async transfers"| node_instrument
node_tokio_adapter -->|"adapts async I/O"| node_async_instrument
node_instrument -->|"uses attributes"| node_attributes
node_instrument -->|"returns status"| node_status
node_instrument -->|"accepts flags"| node_flags
node_event_control -->|"uses event types"| node_events
node_enum_macros -->|"invokes macros"| node_proc_macros
node_proc_macros -->|"dispatches to"| node_attribute_codegen
node_proc_macros -->|"uses generator"| node_repr_codegen
node_proc_macros -->|"uses rewriting"| node_identifier_rewrite
node_attribute_codegen -->|"uses ranges"| node_attribute_ranges
node_repr_codegen -->|"uses rewriting"| node_identifier_rewrite

click node_resource_manager "https://github.com/tsuitoar/visa-rs/blob/main/src/lib.rs"
click node_discovery "https://github.com/tsuitoar/visa-rs/blob/main/src/lib.rs"
click node_instrument "https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs"
click node_session_lifecycle "https://github.com/tsuitoar/visa-rs/blob/main/src/session.rs"
click node_sync_io "https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs"
click node_event_control "https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs"
click node_callbacks "https://github.com/tsuitoar/visa-rs/blob/main/src/handler.rs"
click node_async_instrument "https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/mod.rs"
click node_async_callbacks "https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/callback.rs"
click node_async_futures "https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/future.rs"
click node_tokio_adapter "https://github.com/tsuitoar/visa-rs/blob/main/src/async_tokio.rs"
click node_attributes "https://github.com/tsuitoar/visa-rs/blob/main/src/enums/attribute.rs"
click node_events "https://github.com/tsuitoar/visa-rs/blob/main/src/enums/event.rs"
click node_status "https://github.com/tsuitoar/visa-rs/blob/main/src/enums/status.rs"
click node_flags "https://github.com/tsuitoar/visa-rs/blob/main/src/flags.rs"
click node_enum_macros "https://github.com/tsuitoar/visa-rs/blob/main/src/enums/assert.rs"
click node_proc_macros "https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/lib.rs"
click node_attribute_codegen "https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/attrs/mod.rs"
click node_attribute_ranges "https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/attrs/range.rs"
click node_repr_codegen "https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/repr.rs"
click node_identifier_rewrite "https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/rusty_ident.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_resource_manager,node_discovery,node_instrument,node_session_lifecycle,node_sync_io,node_event_control,node_callbacks toneBlue
class node_async_instrument,node_async_callbacks,node_async_futures,node_tokio_adapter toneAmber
class node_attributes,node_events,node_status,node_flags,node_enum_macros toneMint
class node_proc_macros,node_attribute_codegen,node_attribute_ranges,node_repr_codegen,node_identifier_rewrite toneRose
class node_user,node_visa toneIndigo
```

## Components

### Sessions and I/O

- [Resource manager](https://github.com/tsuitoar/visa-rs/blob/main/src/lib.rs): `src/lib.rs`
- [Resource discovery](https://github.com/tsuitoar/visa-rs/blob/main/src/lib.rs): `src/lib.rs`
- [Instrument session](https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs): `src/instrument.rs`
- [Session lifecycle](https://github.com/tsuitoar/visa-rs/blob/main/src/session.rs): `src/session.rs`
- [Synchronous I/O](https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs): `src/instrument.rs`
- [Event control](https://github.com/tsuitoar/visa-rs/blob/main/src/instrument.rs): `src/instrument.rs`
- [Event callbacks](https://github.com/tsuitoar/visa-rs/blob/main/src/handler.rs): `src/handler.rs`

### Async I/O

- [Async instrument](https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/mod.rs): `src/async_io/mod.rs`
- [Completion callbacks](https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/callback.rs): `src/async_io/callback.rs`
- [Async futures](https://github.com/tsuitoar/visa-rs/blob/main/src/async_io/future.rs): `src/async_io/future.rs`
- [Tokio adapter](https://github.com/tsuitoar/visa-rs/blob/main/src/async_tokio.rs): `src/async_tokio.rs`

### VISA Types

- [Attributes](https://github.com/tsuitoar/visa-rs/blob/main/src/enums/attribute.rs): `src/enums/attribute.rs`
- [Event types](https://github.com/tsuitoar/visa-rs/blob/main/src/enums/event.rs): `src/enums/event.rs`
- [Status codes](https://github.com/tsuitoar/visa-rs/blob/main/src/enums/status.rs): `src/enums/status.rs`
- [Operation flags](https://github.com/tsuitoar/visa-rs/blob/main/src/flags.rs): `src/flags.rs`
- [Enum definitions](https://github.com/tsuitoar/visa-rs/blob/main/src/enums/assert.rs): `src/enums/assert.rs`

### Code Generation

- [Macro entry points](https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/lib.rs): `visa-rs-proc/src/lib.rs`
- [Attribute generator](https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/attrs/mod.rs): `visa-rs-proc/src/attrs/mod.rs`
- [Attribute ranges](https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/attrs/range.rs): `visa-rs-proc/src/attrs/range.rs`
- [Representation generator](https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/repr.rs): `visa-rs-proc/src/repr.rs`
- [Identifier rewriting](https://github.com/tsuitoar/visa-rs/blob/main/visa-rs-proc/src/rusty_ident.rs): `visa-rs-proc/src/rusty_ident.rs`

### Other components

- **Rust application**
- **VISA library**

## Connections

- Rust application → Resource manager: opens (evidence: `README.md`)
- Resource manager → Resource discovery: finds resources (evidence: `README.md`)
- Resource manager → Instrument session: opens session (evidence: `README.md`)
- Rust application → Synchronous I/O: exchanges data (evidence: `README.md`)
- Resource manager → VISA library: uses native API
- Instrument session → VISA library: uses native API
- Instrument session → Session lifecycle: owns session (evidence: `src/session.rs`)
- Instrument session → Synchronous I/O: provides (evidence: `src/instrument.rs`)
- Instrument session → Event control: provides (evidence: `src/instrument.rs`)
- Event control → Event callbacks: installs handler (evidence: `src/handler.rs`)
- Rust application → Async instrument: uses async I/O (evidence: `src/async_io/mod.rs`)
- Async instrument → Completion callbacks: registers completion (evidence: `src/async_io/mod.rs`)
- Async instrument → Async futures: creates futures (evidence: `src/async_io/mod.rs`)
- Async futures → Instrument session: uses async transfers (evidence: `src/async_io/future.rs`)
- Tokio adapter → Async instrument: adapts async I/O (evidence: `src/async_tokio.rs`)
- Instrument session → Attributes: uses attributes (evidence: `src/enums/attribute.rs`)
- Instrument session → Status codes: returns status (evidence: `src/instrument.rs`)
- Instrument session → Operation flags: accepts flags (evidence: `src/async_tokio.rs`)
- Event control → Event types: uses event types (evidence: `src/enums/event.rs`)
- Enum definitions → Macro entry points: invokes macros
- Macro entry points → Attribute generator: dispatches to (evidence: `visa-rs-proc/src/lib.rs`)
- Macro entry points → Representation generator: uses generator (evidence: `visa-rs-proc/src/lib.rs`)
- Macro entry points → Identifier rewriting: uses rewriting (evidence: `visa-rs-proc/src/lib.rs`)
- Attribute generator → Attribute ranges: uses ranges (evidence: `visa-rs-proc/src/attrs/mod.rs`)
- Representation generator → Identifier rewriting: uses rewriting (evidence: `visa-rs-proc/src/repr.rs`)
