use log::{debug, error};
use nuts_backend::{Backend, Binary};
use nuts_bytes::Reader;
use std::marker::PhantomData;
use crate::id::Id;
use crate::magic::{Magic, MAGIC};
use crate::SID;
pub struct Migration<B>(PhantomData<B>);
impl<B: Backend> nuts_container::Migration for Migration<B> {
fn migrate_rev0(&self, userdata: &[u8]) -> Result<(u32, Vec<u8>), String> {
let mut reader = Reader::new(userdata);
debug!("migrating top-id from userdata");
match reader.read::<Magic>() {
Ok(magic) if magic != MAGIC => {
let err = "magic mismatch, the container does not have an archive";
error!("{}: {:?}", err, magic);
return Err(err.to_string());
}
Ok(_) => {
}
Err(err) => {
return Err(format!("failed to read magic from userdata: {}", err));
}
};
match reader.read::<Id<B>>() {
Ok(id) => {
debug!("top-id: {}", id);
Ok((SID, id.as_bytes()))
}
Err(err) => Err(format!("failed to read id from userdata: {}", err)),
}
}
}
impl<B> Default for Migration<B> {
fn default() -> Self {
Self(PhantomData)
}
}