#![cfg_attr(docsrs, doc = include_str!("../examples/remote_store_ureq.rs"))]
#![warn(unused_lifetimes, missing_docs)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(feature = "nightly", feature(ascii_char))]
#![cfg_attr(feature = "nightly", feature(ascii_char_variants))]
#[cfg(feature = "codegen")]
#[cfg_attr(docsrs, doc(cfg(feature = "codegen")))]
pub mod codegen;
pub mod hex_string;
pub mod identity;
mod random;
use std::fs::{File, OpenOptions};
use std::io::{self, BufRead, Write};
use std::path::Path;
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("perfume codegen error: {0}")]
Codegen(String),
#[error("perfume io error: {0}")]
Io(#[from] io::Error),
}
pub const STORAGE_KEY_LENGTH: usize = 3;
pub const STORAGE_DIGEST_LENGTH: usize = 64 - STORAGE_KEY_LENGTH;
#[allow(dead_code)]
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where
P: AsRef<Path>,
{
let file = File::open(filename)?;
Ok(io::BufReader::new(file).lines())
}
#[allow(dead_code)]
fn write_lines<P>(filename: P, lines: &Vec<String>, overwrite: bool) -> io::Result<()>
where
P: AsRef<Path>,
{
let mut file = OpenOptions::new()
.write(true)
.create_new(!overwrite)
.append(false)
.open(filename)?;
for line in lines {
writeln!(file, "{line}")?;
}
Ok(())
}