// Copyright 2025 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// A type erased snapshot value. Or, alternatively, you can think of it as a partially
/// (de)serialized value that can be nested in other values without incurring double encoding in
/// the final output.
///
/// There is a performance and code size cost to this type, so only use it if really needed, for
/// example, in traits that must be dyn compatible.
///
/// If the intermediate representation and the final serialization format don't match, for example,
/// if `AnySnapshot` was implemented with `serde_json::Value` but then written to a file as CBOR,
/// it will technically work, but the result might not match what you'd get if you directly
/// serialized the original value. That should be OK as long as the serialization and
/// deserialization paths make symmetric use of `AnySnapshot`.
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct AnySnapshot(ciborium::Value);
impl AnySnapshot {
pub fn to_any(x: impl serde::Serialize) -> anyhow::Result<Self> {
Ok(AnySnapshot(ciborium::Value::serialized(&x)?))
}
pub fn from_any<T: serde::de::DeserializeOwned>(x: Self) -> anyhow::Result<T> {
Ok(x.0.deserialized()?)
}
}