blob: eb011599ab7393b8c10ea2bd999708885de49ba7 [file] [log] [blame]
// Copyright 2020 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.
//! The `inspect-writable` library defines traits for simple data structures that can be
//! written to inspect and exports a procedural macro to implement these traits.
// TODO(jsankey): More documentation and examples when this is stable, and try to move it
// somewhere into inspect contrib.
// Re-export the derive-macro.
pub use inspect_writable_derive::*;
use fuchsia_inspect::Node;
/// A datatype that may be written to an inspect type. This trait can be automatically derived for
/// structs composed of inspect-compatible fields, i.e. signed integers, unsigned integers, or types
/// implementing the `Debug` trait.
pub trait InspectWritable: Sized {
/// The wrapper type returned from `create` calls.
type NodeType: InspectWritableNode<Self>;
/// Writes the contents of the struct into inspect fields on the supplied node. Field names
/// match the fields in the struct. This function uses the `create*` methods in the inspect
/// API and returns an `InspectWriteableNode` that may be used to update the fields in the
/// future.
fn create(&self, node: Node) -> Self::NodeType;
/// Writes the contents of the struct into inspect fields on the supplied node. Field names
/// match the fields in the struct. This function uses the `record*` methods in the inspect
/// API and should be used for fields that are never modified.
fn record(&self, node: &Node);
}
/// A wrapper around an Inspect node and a collection of inspect fields. These fields are created
/// and may updated using the contents of an `InspectWritable` struct. A struct implementing
/// `InspectWritableNode` is automatically generated when the `InspectWritable` trait is derived.
pub trait InspectWritableNode<T: InspectWritable> {
/// Create a new instance, wrapping the supplied `node`. Inspect fields are created with names
/// matching those in the `InspectWritable` struct and initialized to the values in `data`.
fn new(data: &T, node: Node) -> Self;
/// Updates all inspect fields to the values in `data`.
fn update(&self, data: &T);
/// Returns a reference to the wrapped inspect `Node`.
fn inspect_node(&self) -> &Node;
}