// Copyright © 2022 Kim Altintop // SPDX-License-Identifier: GPL-2.0-only WITH openvpn-openssl-exception use std::str::FromStr; use serde::{ Deserialize, Deserializer, Serialize, Serializer, }; pub mod oid { use super::*; #[derive(serde::Serialize, serde::Deserialize)] pub struct Oid(#[serde(with = "self")] pub git2::Oid); impl From for Oid { fn from(oid: git2::Oid) -> Self { Self(oid) } } pub fn serialize(oid: &git2::Oid, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(&oid.to_string()) } pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let hex: &str = Deserialize::deserialize(deserializer)?; git2::Oid::from_str(hex).map_err(serde::de::Error::custom) } pub mod option { use super::*; pub fn serialize(oid: &Option, serializer: S) -> Result where S: Serializer, { oid.as_ref().map(ToString::to_string).serialize(serializer) } #[allow(unused)] pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let hex: Option<&str> = Deserialize::deserialize(deserializer)?; hex.map(FromStr::from_str) .transpose() .map_err(serde::de::Error::custom) } } }