blob: 8d25cc2b7320e798e1e98dcdeeaf8da493dccb92 [file] [view]
<!-- Copyright 2026 The Fuchsia Authors. All rights reserved. -->
<!-- Use of this source code is governed by a BSD-style license that can be -->
<!-- found in the LICENSE file. -->
# FFX Machine-Readable JSON Schemas Specification
This document blueprints the architectural framework and type safety constraints governing machine-readable JSON outputs inside `fuchsia.git`.
## Architectural Overview
To support automation scripts, continuous integration hooks, and high-level developer orchestration tools, many `ffx` subcommand plugins emit structured, machine-parseable outputs when invoked with the global flag:
```sh
ffx --machine json <subcommand>
```
To ensure these data blocks maintain strict backward compatibility contracts and do not induce silent breakdown regressions downstream, all machine-parseable types are strongly typed and validated via compile-time schemas.
## The Schemars Integration Framework
Fuchsia utilizes the `schemars` Rust crate to enforce programmatic schema generation. Plugin authors define an output payload enum or structure type representing the console data payload and derive the traits:
```rust
use schemars::JsonSchema;
use serde::Serialize;
#[derive(Debug, Serialize, JsonSchema, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum CommandOutputMessage {
Message(String),
Data(serde_json::Value),
}
```
Deriving `JsonSchema` enables the compilation toolchain to automatically reflect and extract the corresponding schema layout mapping matrix.
## Output Transmission via `VerifiedMachineWriter`
Plugins that support machine-readable output use a specialized writer class `VerifiedMachineWriter` provided by the `ffx_writer` framework library:
```rust
impl FfxMain for MyTool {
type Writer = VerifiedMachineWriter<CommandOutputMessage>;
async fn main(self, mut writer: Self::Writer) -> fho::Result<()> {
// ...
writer.item(&CommandOutputMessage::Message("Operation successful.".into()))?;
Ok(())
}
}
```
`VerifiedMachineWriter` guarantees that all values written to stdout cleanly match the derived structural layout specification parameters.
## Golden Schema Verification Gates
To prevent unintentional API breaks, the build system automatically tracks and asserts all CLI schemas using an automated test integration sub-suite called `cli-goldens` located at:
```
//src/developer/ffx/tests/cli-goldens/
```
When fields are altered, added, or modified inside a plugin's argument or output structures, the build system generates the dynamic actual schemas and asserts them against the source Goldens under `cli-goldens/goldens/ffx/`. Mismatches will instantly halt the build process, requiring explicit developer review and synchronization acknowledgement commands:
```sh
cp out/default/host_x64/obj/src/developer/ffx/tests/cli-goldens/goldens/... <source_tree_path>
```
This double-check mechanism ensures complete schema governance health across the repository tree.