mod pinner;
mod store;
pub use pinner::*;
pub use store::*;
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum PinMode {
Direct,
Recursive,
Indirect,
}
impl PinMode {
pub fn parse(s: &str) -> Option<Self> {
match s.to_lowercase().as_str() {
"direct" => Some(PinMode::Direct),
"recursive" => Some(PinMode::Recursive),
"indirect" => Some(PinMode::Indirect),
"all" => None, _ => None,
}
}
pub fn as_str(&self) -> &'static str {
match self {
PinMode::Direct => "direct",
PinMode::Recursive => "recursive",
PinMode::Indirect => "indirect",
}
}
}
impl std::fmt::Display for PinMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct PinInfo {
pub cid: String,
pub mode: PinMode,
pub name: Option<String>,
}
#[derive(Debug, Error)]
pub enum PinError {
#[error("Block not found: {0}")]
BlockNotFound(String),
#[error("CID not pinned: {0}")]
NotPinned(String),
#[error("CID already pinned: {0}")]
AlreadyPinned(String),
#[error("Cannot unpin indirect pin directly: {0}")]
CannotUnpinIndirect(String),
#[error("Blockstore error: {0}")]
Blockstore(#[from] ferripfs_blockstore::BlockstoreError),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[error("CID parse error: {0}")]
CidParse(String),
#[error("Pin verification failed: {0}")]
VerificationFailed(String),
}
pub type PinResult<T> = Result<T, PinError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pin_mode_from_str() {
assert_eq!(PinMode::parse("direct"), Some(PinMode::Direct));
assert_eq!(PinMode::parse("recursive"), Some(PinMode::Recursive));
assert_eq!(PinMode::parse("indirect"), Some(PinMode::Indirect));
assert_eq!(PinMode::parse("all"), None);
assert_eq!(PinMode::parse("invalid"), None);
}
#[test]
fn test_pin_mode_display() {
assert_eq!(PinMode::Direct.to_string(), "direct");
assert_eq!(PinMode::Recursive.to_string(), "recursive");
assert_eq!(PinMode::Indirect.to_string(), "indirect");
}
}