use cllw_ore::{OpeCllw8VariableV1, OreCllw8VariableV1};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, PartialOrd, Serialize, Deserialize)]
#[serde(untagged)]
#[non_exhaustive]
pub enum EncryptedSteVecTerm {
Compat {
#[serde(with = "hex::serde", rename = "op")]
op: OpeCllw8VariableV1,
},
Standard {
#[serde(with = "hex::serde", rename = "oc")]
oc: OreCllw8VariableV1,
},
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn compat_ope_serializes_as_op() {
let term = EncryptedSteVecTerm::Compat {
op: OpeCllw8VariableV1::from_bytes(vec![1, 2, 3]),
};
assert_eq!(
serde_json::to_value(&term).unwrap(),
json!({"op": "010203"})
);
}
#[test]
fn compat_ope_roundtrips_through_serde() {
let term = EncryptedSteVecTerm::Compat {
op: OpeCllw8VariableV1::from_bytes(vec![0xde, 0xad]),
};
let s = serde_json::to_string(&term).unwrap();
let back: EncryptedSteVecTerm = serde_json::from_str(&s).unwrap();
assert_eq!(back, term);
}
#[test]
fn standard_ore_serializes_as_oc() {
let term = EncryptedSteVecTerm::Standard {
oc: OreCllw8VariableV1::from(vec![0x42, 0x43]),
};
assert_eq!(serde_json::to_value(&term).unwrap(), json!({"oc": "4243"}));
}
#[test]
fn standard_ore_roundtrips_through_serde() {
let term = EncryptedSteVecTerm::Standard {
oc: OreCllw8VariableV1::from(vec![0x99]),
};
let s = serde_json::to_string(&term).unwrap();
let back: EncryptedSteVecTerm = serde_json::from_str(&s).unwrap();
assert_eq!(back, term);
}
#[test]
fn legacy_hm_key_does_not_deserialize_as_a_term() {
assert!(serde_json::from_value::<EncryptedSteVecTerm>(json!({"hm": "abcd"})).is_err());
}
}