feat(tvix/nix-compat): impl Deserialize, Serialize for Signature
Change-Id: I30294079129b0e5b4faa3272e09df982d3ef2178 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11394 Reviewed-by: raitobezarius <tvl@lahfa.xyz> Tested-by: BuildkiteCI
This commit is contained in:
parent
a2322d7c14
commit
3d7f80c0e3
1 changed files with 47 additions and 1 deletions
|
@ -2,8 +2,9 @@ use std::fmt::{self, Display};
|
||||||
|
|
||||||
use data_encoding::BASE64;
|
use data_encoding::BASE64;
|
||||||
use ed25519_dalek::SIGNATURE_LENGTH;
|
use ed25519_dalek::SIGNATURE_LENGTH;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct Signature<'a> {
|
pub struct Signature<'a> {
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
bytes: [u8; SIGNATURE_LENGTH],
|
bytes: [u8; SIGNATURE_LENGTH],
|
||||||
|
@ -57,6 +58,29 @@ impl<'a> Signature<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'de: 'a, 'a> Deserialize<'de> for Signature<'a> {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let str: &'de str = Deserialize::deserialize(deserializer)?;
|
||||||
|
Self::parse(str).map_err(|_| {
|
||||||
|
serde::de::Error::invalid_value(serde::de::Unexpected::Str(str), &"Signature")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Serialize for Signature<'a> {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: serde::Serializer,
|
||||||
|
{
|
||||||
|
let string: String = self.to_string();
|
||||||
|
|
||||||
|
string.serialize(serializer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
#[error("Invalid name: {0}")]
|
#[error("Invalid name: {0}")]
|
||||||
|
@ -79,6 +103,7 @@ impl Display for Signature<'_> {
|
||||||
mod test {
|
mod test {
|
||||||
use data_encoding::BASE64;
|
use data_encoding::BASE64;
|
||||||
use ed25519_dalek::VerifyingKey;
|
use ed25519_dalek::VerifyingKey;
|
||||||
|
use hex_literal::hex;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
use super::Signature;
|
use super::Signature;
|
||||||
|
@ -129,4 +154,25 @@ mod test {
|
||||||
fn parse_fail(input: &'static str) {
|
fn parse_fail(input: &'static str) {
|
||||||
Signature::parse(input).expect_err("must fail");
|
Signature::parse(input).expect_err("must fail");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize_deserialize() {
|
||||||
|
let signature_actual = Signature {
|
||||||
|
name: "cache.nixos.org-1",
|
||||||
|
bytes: hex!(
|
||||||
|
r#"4e c4 d3 6f 75 86 4d 92 a9 86 f6 1d 04 75 f0 a3
|
||||||
|
ac 1e 54 82 e6 4f 2b 54 8c b0 7e bd c5 fc f5 f3
|
||||||
|
a3 8d 18 9c 08 79 8a 03 84 42 3c c5 4b 92 3e 93
|
||||||
|
30 9e 06 31 7d c7 3d 55 91 74 3d 61 91 e2 99 05"#
|
||||||
|
),
|
||||||
|
};
|
||||||
|
let signature_str_json = "\"cache.nixos.org-1:TsTTb3WGTZKphvYdBHXwo6weVILmTytUjLB+vcX89fOjjRicCHmKA4RCPMVLkj6TMJ4GMX3HPVWRdD1hkeKZBQ==\"";
|
||||||
|
|
||||||
|
let serialized = serde_json::to_string(&signature_actual).expect("must serialize");
|
||||||
|
assert_eq!(signature_str_json, &serialized);
|
||||||
|
|
||||||
|
let deserialized: Signature<'_> =
|
||||||
|
serde_json::from_str(signature_str_json).expect("must deserialize");
|
||||||
|
assert_eq!(&signature_actual, &deserialized);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue