|
@@ -1,6 +1,11 @@
|
|
|
|
+use std::fmt;
|
|
|
|
+use std::str::FromStr;
|
|
|
|
+
|
|
use serde::ser::SerializeTuple;
|
|
use serde::ser::SerializeTuple;
|
|
use serde::{Deserialize, Serialize, Serializer};
|
|
use serde::{Deserialize, Serialize, Serializer};
|
|
|
|
|
|
|
|
+use crate::error::Error;
|
|
|
|
+
|
|
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
|
|
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
|
|
pub enum Kind {
|
|
pub enum Kind {
|
|
/// NUT-11 P2PK
|
|
/// NUT-11 P2PK
|
|
@@ -42,7 +47,6 @@ impl Serialize for Secret {
|
|
s.end()
|
|
s.end()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-/*
|
|
|
|
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub struct UncheckedSecret(String);
|
|
pub struct UncheckedSecret(String);
|
|
|
|
|
|
@@ -62,16 +66,24 @@ impl<S> From<S> for UncheckedSecret
|
|
where
|
|
where
|
|
S: Into<String>,
|
|
S: Into<String>,
|
|
{
|
|
{
|
|
- fn from(url: S) -> Self {
|
|
|
|
- Self(url.into())
|
|
|
|
|
|
+ fn from(inner: S) -> Self {
|
|
|
|
+ Self(inner.into())
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+impl TryFrom<Secret> for UncheckedSecret {
|
|
|
|
+ type Error = serde_json::Error;
|
|
|
|
+
|
|
|
|
+ fn try_from(secret: Secret) -> Result<UncheckedSecret, Self::Error> {
|
|
|
|
+ Ok(UncheckedSecret(serde_json::to_string(&secret)?))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
impl FromStr for UncheckedSecret {
|
|
impl FromStr for UncheckedSecret {
|
|
- type Err = ParseError;
|
|
|
|
|
|
+ type Err = Error;
|
|
|
|
|
|
- fn from_str(url: &str) -> Result<Self, Self::Err> {
|
|
|
|
- Ok(Self::from(url))
|
|
|
|
|
|
+ fn from_str(value: &str) -> Result<Self, Self::Err> {
|
|
|
|
+ Ok(Self::from(value))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -83,6 +95,14 @@ impl TryFrom<UncheckedSecret> for Secret {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+impl TryFrom<&UncheckedSecret> for Secret {
|
|
|
|
+ type Error = serde_json::Error;
|
|
|
|
+
|
|
|
|
+ fn try_from(unchecked_secret: &UncheckedSecret) -> Result<Secret, Self::Error> {
|
|
|
|
+ serde_json::from_str(&unchecked_secret.0)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
#[cfg(test)]
|
|
#[cfg(test)]
|
|
mod tests {
|
|
mod tests {
|
|
use std::assert_eq;
|
|
use std::assert_eq;
|
|
@@ -90,44 +110,6 @@ mod tests {
|
|
use super::*;
|
|
use super::*;
|
|
|
|
|
|
#[test]
|
|
#[test]
|
|
- fn test_secret_deserialize() {
|
|
|
|
- let secret_str = r#"[
|
|
|
|
- "P2PK",
|
|
|
|
- {
|
|
|
|
- "nonce": "5d11913ee0f92fefdc82a6764fd2457a",
|
|
|
|
- "data": "026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198",
|
|
|
|
- "tags": [["key", "value1", "value2"]]
|
|
|
|
- }
|
|
|
|
-]"#
|
|
|
|
- .to_string();
|
|
|
|
- let secret_str = String::from(
|
|
|
|
- r#"["P2PK",{"nonce":"5d11913ee0f92fefdc82a6764fd2457a","data":"026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198","tags":[["key","value1","value2"]]}]"#,
|
|
|
|
- );
|
|
|
|
- println!("{}", secret_str);
|
|
|
|
-
|
|
|
|
- let t = UncheckedSecret::from_str(&secret_str);
|
|
|
|
-
|
|
|
|
- let secret_ser: UncheckedSecret = serde_json::from_str(&secret_str).unwrap();
|
|
|
|
- let secret = Secret {
|
|
|
|
- kind: Kind::P2PK,
|
|
|
|
- secret_data: SecretData {
|
|
|
|
- nonce: "5d11913ee0f92fefdc82a6764fd2457a".to_string(),
|
|
|
|
- data: "026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198"
|
|
|
|
- .to_string(),
|
|
|
|
- tags: Some(vec![vec![
|
|
|
|
- "key".to_string(),
|
|
|
|
- "value1".to_string(),
|
|
|
|
- "value2".to_string(),
|
|
|
|
- ]]),
|
|
|
|
- },
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- println!("{}", serde_json::to_string(&secret).unwrap());
|
|
|
|
-
|
|
|
|
- assert_eq!(secret, secret_ser.try_into().unwrap());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- #[test]
|
|
|
|
fn test_secret_serialize() {
|
|
fn test_secret_serialize() {
|
|
let secret = Secret {
|
|
let secret = Secret {
|
|
kind: Kind::P2PK,
|
|
kind: Kind::P2PK,
|
|
@@ -145,29 +127,6 @@ mod tests {
|
|
|
|
|
|
let secret_str = r#"["P2PK",{"nonce":"5d11913ee0f92fefdc82a6764fd2457a","data":"026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198","tags":[["key","value1","value2"]]}]"#;
|
|
let secret_str = r#"["P2PK",{"nonce":"5d11913ee0f92fefdc82a6764fd2457a","data":"026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198","tags":[["key","value1","value2"]]}]"#;
|
|
|
|
|
|
- let secret = UncheckedSecret(secret_str.to_string());
|
|
|
|
-
|
|
|
|
- println!("se; {}", secret);
|
|
|
|
-
|
|
|
|
- assert_eq!(secret.to_string(), secret_str);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- #[test]
|
|
|
|
- fn test_secret_roundtrip() {
|
|
|
|
- let secret_str = r#"["P2PK",{"nonce":"5d11913ee0f92fefdc82a6764fd2457a","data":"026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198","tags":[["key","value1","value2"]]}]"#;
|
|
|
|
-
|
|
|
|
- let secret_ser: Secret = serde_json::from_str(secret_str).unwrap();
|
|
|
|
-
|
|
|
|
- assert_eq!(serde_json::to_string(&secret_ser).unwrap(), secret_str)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- #[test]
|
|
|
|
- fn test_unchecked_secret_roundtrip() {
|
|
|
|
- let secret_str = r#"["P2PK",{"nonce":"5d11913ee0f92fefdc82a6764fd2457a","data":"026562efcfadc8e86d44da6a8adf80633d974302e62c850774db1fb36ff4cc7198","tags":[["key","value1","value2"]]}]"#.to_string();
|
|
|
|
-
|
|
|
|
- let secret_ser: UncheckedSecret = serde_json::from_str(&secret_str).unwrap();
|
|
|
|
-
|
|
|
|
- assert_eq!(secret_ser.to_string(), secret_str)
|
|
|
|
|
|
+ assert_eq!(serde_json::to_string(&secret).unwrap(), secret_str);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-*/
|
|
|