pub mod text;
use crate::*;
pub trait Document: Debug + Clone + PartialEq + Eq {
type PublicKey: PublicKey;
fn as_bytes(&self) -> BeefCow<[u8]>;
fn blockstamp(&self) -> Blockstamp;
fn currency(&self) -> &str;
fn issuers(&self) -> SmallVec<[Self::PublicKey; 1]>;
fn signatures(&self) -> SmallVec<[<Self::PublicKey as PublicKey>::Signature; 1]>;
#[inline]
fn verify_one_signature(
&self,
public_key: &Self::PublicKey,
signature: &<Self::PublicKey as PublicKey>::Signature,
) -> Result<(), SigError> {
public_key.verify(self.as_bytes().as_ref(), signature)
}
fn verify_signatures(&self) -> Result<(), DocumentSigsErr> {
let issuers_count = self.issuers().len();
let signatures_count = self.signatures().len();
if issuers_count != signatures_count {
Err(DocumentSigsErr::IncompletePairs(
issuers_count,
signatures_count,
))
} else {
let issuers = self.issuers();
let signatures = self.signatures();
let mismatches: HashMap<usize, SigError> = issuers
.iter()
.zip(signatures)
.enumerate()
.filter_map(|(i, (key, signature))| {
if let Err(e) = self.verify_one_signature(key, &signature) {
Some((i, e))
} else {
None
}
})
.collect();
if mismatches.is_empty() {
Ok(())
} else {
Err(DocumentSigsErr::Invalid(mismatches))
}
}
}
fn version(&self) -> usize;
}
pub trait DocumentBuilder {
type Document: Document;
type Signator: Signator<
Signature = <<Self::Document as Document>::PublicKey as PublicKey>::Signature,
>;
fn build_and_sign(self, signators: Vec<Self::Signator>) -> Self::Document;
fn build_with_signature(
self,
signatures: SmallVec<
[<<Self::Document as Document>::PublicKey as PublicKey>::Signature; 1],
>,
) -> Self::Document;
}
pub trait ToStringObject {
type StringObject: Serialize;
fn to_string_object(&self) -> Self::StringObject;
}
pub trait ToJsonObject: ToStringObject {
fn to_json_string(&self) -> Result<String, serde_json::Error> {
Ok(serde_json::to_string(&self.to_string_object())?)
}
fn to_json_string_pretty(&self) -> Result<String, serde_json::Error> {
Ok(serde_json::to_string_pretty(&self.to_string_object())?)
}
}
impl<T: ToStringObject> ToJsonObject for T {}