use ::armor::{ArmorHeader, ArmorParseError, AsciiArmor, ASCII_ARMOR_ID};
use amplify::confinement::{self, Confined, U24 as U24MAX};
use strict_encoding::{DeserializeError, StrictDeserialize, StrictSerialize};
use super::*;
const ASCII_ARMOR_ISAE: &str = "ISA-Extensions";
const ASCII_ARMOR_DEPENDENCY: &str = "Dependency";
#[derive(Clone, Eq, PartialEq, Debug, Display, Error, From)]
#[display(inner)]
pub enum LibArmorError {
#[from]
Armor(ArmorParseError),
#[from(confinement::Error)]
TooLarge,
#[from]
Decode(DeserializeError),
}
impl AsciiArmor for Lib {
type Err = LibArmorError;
const PLATE_TITLE: &'static str = "ALUVM LIB";
fn ascii_armored_headers(&self) -> Vec<ArmorHeader> {
let mut headers = vec![
ArmorHeader::new(ASCII_ARMOR_ID, self.lib_id().to_string()),
ArmorHeader::new(ASCII_ARMOR_ISAE, self.isae_string()),
];
for dep in &self.libs {
headers.push(ArmorHeader::new(ASCII_ARMOR_DEPENDENCY, dep.to_string()));
}
headers
}
fn to_ascii_armored_data(&self) -> Vec<u8> {
self.to_strict_serialized::<U24MAX>()
.expect("type guarantees")
.to_vec()
}
fn with_headers_data(_headers: Vec<ArmorHeader>, data: Vec<u8>) -> Result<Self, Self::Err> {
let data = Confined::try_from(data)?;
let me = Self::from_strict_serialized::<U24MAX>(data)?;
Ok(me)
}
}