use apps_ledger_services_public::*;
use fidl::Error;
use fuchsia::read_entire_vmo;
use magenta::{self, Vmo};
use sha2::{Digest, Sha256};
pub const OK: Status = Status_Ok;
pub const KEY_NOT_FOUND: Status = Status_KeyNotFound;
pub const NEEDS_FETCH: Status = Status_NeedsFetch;
pub const RESULT_COMPLETED: ResultState = ResultState_Completed;
pub fn ledger_crash_callback(res: Result<Status, Error>) {
let status = res.expect("ledger call failed to respond with a status");
assert_eq!(status, Status_Ok, "ledger call failed");
}
#[derive(Debug)]
pub enum ValueError {
NeedsFetch,
LedgerFail(Status),
Vmo(magenta::Status),
}
pub fn value_result(res: (Status, Option<Vmo>)) -> Result<Option<Vec<u8>>, ValueError> {
match res {
(OK, Some(vmo)) => {
let buffer = read_entire_vmo(&vmo).map_err(ValueError::Vmo)?;
Ok(Some(buffer))
}
(KEY_NOT_FOUND, _) => Ok(None),
(NEEDS_FETCH, _) => Err(ValueError::NeedsFetch),
(status, _) => Err(ValueError::LedgerFail(status)),
}
}
pub fn gen_page_id(input_data: &[u8]) -> [u8; 16] {
let mut hasher = Sha256::default();
hasher.input(input_data);
let full_hash = hasher.result();
let full_slice = full_hash.as_slice();
let mut arr: [u8; 16] = Default::default();
arr.as_mut().clone_from_slice(&full_slice[0..16]);
arr
}