mod author;
mod blob;
mod doc;
mod endpoint;
mod error;
mod gossip;
mod key;
mod net;
mod node;
mod tag;
mod ticket;
pub use self::author::*;
pub use self::blob::*;
pub use self::doc::*;
pub use self::endpoint::*;
pub use self::error::*;
pub use self::gossip::*;
pub use self::key::*;
pub use self::net::*;
pub use self::node::*;
pub use self::tag::*;
pub use self::ticket::*;
use tracing_subscriber::filter::LevelFilter;
uniffi::setup_scaffolding!();
#[derive(Debug, uniffi::Enum)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
Off,
}
impl From<LogLevel> for LevelFilter {
fn from(level: LogLevel) -> LevelFilter {
match level {
LogLevel::Trace => LevelFilter::TRACE,
LogLevel::Debug => LevelFilter::DEBUG,
LogLevel::Info => LevelFilter::INFO,
LogLevel::Warn => LevelFilter::WARN,
LogLevel::Error => LevelFilter::ERROR,
LogLevel::Off => LevelFilter::OFF,
}
}
}
#[uniffi::export]
pub fn set_log_level(level: LogLevel) {
use tracing_subscriber::{fmt, prelude::*, reload};
let filter: LevelFilter = level.into();
let (filter, _) = reload::Layer::new(filter);
let mut layer = fmt::Layer::default();
layer.set_ansi(false);
tracing_subscriber::registry()
.with(filter)
.with(layer)
.init();
}
#[uniffi::export]
pub fn key_to_path(
key: Vec<u8>,
prefix: Option<String>,
root: Option<String>,
) -> Result<String, IrohError> {
let path = iroh_blobs::util::fs::key_to_path(key, prefix, root.map(std::path::PathBuf::from))?;
let path = path.to_str();
let path = path.ok_or_else(|| anyhow::anyhow!("Unable to parse path {:?}", path))?;
let path = path.to_string();
Ok(path)
}
#[uniffi::export]
pub fn path_to_key(
path: String,
prefix: Option<String>,
root: Option<String>,
) -> Result<Vec<u8>, IrohError> {
iroh_blobs::util::fs::path_to_key(
std::path::PathBuf::from(path),
prefix,
root.map(std::path::PathBuf::from),
)
.map(|k| k.to_vec())
.map_err(IrohError::from)
}
#[cfg(test)]
fn setup_logging() {
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
tracing_subscriber::registry()
.with(fmt::layer())
.with(EnvFilter::from_default_env())
.try_init()
.ok();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_path_to_key_roundtrip() {
let path = std::path::PathBuf::from("/").join("foo").join("bar");
let path = path.to_str().unwrap().to_string();
let mut key = b"/foo/bar\0".to_vec();
let got_key = path_to_key(path.clone(), None, None).unwrap();
assert_eq!(key, got_key);
let got_path = key_to_path(got_key.clone(), None, None).unwrap();
assert_eq!(path, got_path);
let prefix = String::from("prefix:");
key = b"prefix:/foo/bar\0".to_vec();
let got_key = path_to_key(path.clone(), Some(prefix.clone()), None).unwrap();
assert_eq!(key, got_key);
let got_path = key_to_path(got_key.clone(), Some(prefix.clone()), None).unwrap();
assert_eq!(path, got_path);
let root = std::path::PathBuf::from("/").join("foo");
let root = root.to_str().unwrap().to_string();
key = b"prefix:bar\0".to_vec();
let got_key = path_to_key(path.clone(), Some(prefix.clone()), Some(root.clone())).unwrap();
assert_eq!(key, got_key);
let got_path =
key_to_path(got_key.clone(), Some(prefix.clone()), Some(root.clone())).unwrap();
assert_eq!(path, got_path);
}
}