use std::str::FromStr;
use std::sync::Arc;
use crate::blob::{BlobDownloadOptions, BlobFormat, Hash};
use crate::doc::NodeAddr;
use crate::error::IrohError;
#[derive(Debug, uniffi::Object)]
#[uniffi::export(Display)]
pub struct NodeTicket(iroh_base::ticket::NodeTicket);
impl From<iroh_base::ticket::NodeTicket> for NodeTicket {
fn from(ticket: iroh_base::ticket::NodeTicket) -> Self {
NodeTicket(ticket)
}
}
impl std::fmt::Display for NodeTicket {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[uniffi::export]
impl NodeTicket {
#[uniffi::constructor]
pub fn new(addr: &NodeAddr) -> Result<Self, IrohError> {
let inner = TryInto::<iroh::NodeAddr>::try_into(addr.clone())?;
Ok(iroh_base::ticket::NodeTicket::new(inner).into())
}
#[uniffi::constructor]
pub fn parse(str: String) -> Result<Self, IrohError> {
let ticket = iroh_base::ticket::NodeTicket::from_str(&str).map_err(anyhow::Error::from)?;
Ok(NodeTicket(ticket))
}
pub fn node_addr(&self) -> Arc<NodeAddr> {
let addr = self.0.node_addr().clone();
Arc::new(addr.into())
}
}
#[derive(Debug, uniffi::Object)]
#[uniffi::export(Display)]
pub struct BlobTicket(iroh_blobs::ticket::BlobTicket);
impl From<iroh_blobs::ticket::BlobTicket> for BlobTicket {
fn from(ticket: iroh_blobs::ticket::BlobTicket) -> Self {
BlobTicket(ticket)
}
}
impl std::fmt::Display for BlobTicket {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[uniffi::export]
impl BlobTicket {
#[uniffi::constructor]
pub fn new(str: String) -> Result<Self, IrohError> {
let ticket = iroh_blobs::ticket::BlobTicket::from_str(&str).map_err(anyhow::Error::from)?;
Ok(BlobTicket(ticket))
}
pub fn hash(&self) -> Arc<Hash> {
Arc::new(self.0.hash().into())
}
pub fn node_addr(&self) -> Arc<NodeAddr> {
let addr = self.0.node_addr().clone();
Arc::new(addr.into())
}
pub fn format(&self) -> BlobFormat {
self.0.format().into()
}
pub fn recursive(&self) -> bool {
self.0.format().is_hash_seq()
}
pub fn as_download_options(&self) -> Arc<BlobDownloadOptions> {
let r: BlobDownloadOptions = iroh_blobs::rpc::client::blobs::DownloadOptions {
format: self.0.format(),
nodes: vec![self.0.node_addr().clone()],
tag: iroh_blobs::util::SetTagOption::Auto,
mode: iroh_blobs::net_protocol::DownloadMode::Direct,
}
.into();
Arc::new(r)
}
}
#[derive(Debug, uniffi::Enum)]
pub enum AddrInfoOptions {
Id,
RelayAndAddresses,
Relay,
Addresses,
}
impl From<AddrInfoOptions> for iroh_docs::rpc::AddrInfoOptions {
fn from(options: AddrInfoOptions) -> iroh_docs::rpc::AddrInfoOptions {
match options {
AddrInfoOptions::Id => iroh_docs::rpc::AddrInfoOptions::Id,
AddrInfoOptions::RelayAndAddresses => {
iroh_docs::rpc::AddrInfoOptions::RelayAndAddresses
}
AddrInfoOptions::Relay => iroh_docs::rpc::AddrInfoOptions::Relay,
AddrInfoOptions::Addresses => iroh_docs::rpc::AddrInfoOptions::Addresses,
}
}
}
#[derive(Debug, Clone, uniffi::Object)]
#[uniffi::export(Display)]
pub struct DocTicket(iroh_docs::DocTicket);
impl From<iroh_docs::DocTicket> for DocTicket {
fn from(value: iroh_docs::DocTicket) -> Self {
Self(value)
}
}
impl From<DocTicket> for iroh_docs::DocTicket {
fn from(value: DocTicket) -> Self {
value.0
}
}
#[uniffi::export]
impl DocTicket {
#[uniffi::constructor]
pub fn new(str: String) -> Result<Self, IrohError> {
let ticket = iroh_docs::DocTicket::from_str(&str).map_err(anyhow::Error::from)?;
Ok(ticket.into())
}
}
impl std::fmt::Display for DocTicket {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}