use std::fmt;
use serde::{Deserialize, Serialize};
pub const PUBLIC_IPFS_GATEWAY: &str = "https://ipfs.io/ipfs/";
pub const NEWTON_IPFS_GATEWAY: &str = "https://ipfs.newt.foundation/ipfs/";
fn default_fallback_gateway() -> String {
std::env::var("IPFS_FALLBACK_GATEWAY").unwrap_or(PUBLIC_IPFS_GATEWAY.to_string())
}
fn default_cache_enabled() -> bool {
std::env::var("IPFS_CACHE_ENABLED")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(true)
}
fn default_memory_cache_size() -> usize {
std::env::var("IPFS_MEMORY_CACHE_SIZE")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(100)
}
fn default_memory_cache_ttl_secs() -> u64 {
std::env::var("IPFS_MEMORY_CACHE_TTL_SECS")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(3600) }
fn default_redis_cache_enabled() -> bool {
std::env::var("IPFS_REDIS_CACHE_ENABLED")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(true)
}
fn default_redis_cache_ttl_secs() -> u64 {
std::env::var("IPFS_REDIS_CACHE_TTL_SECS")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(43200) }
fn default_max_fetch_size_bytes() -> usize {
std::env::var("IPFS_MAX_FETCH_SIZE_BYTES")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(50 * 1024 * 1024) }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct IpfsConfig {
pub gateway: String,
pub params: String,
#[serde(default = "default_fallback_gateway")]
pub fallback_gateway: String,
#[serde(default = "default_cache_enabled")]
pub cache_enabled: bool,
#[serde(default = "default_memory_cache_size")]
pub memory_cache_size: usize,
#[serde(default = "default_memory_cache_ttl_secs")]
pub memory_cache_ttl_secs: u64,
#[serde(default = "default_redis_cache_enabled")]
pub redis_cache_enabled: bool,
#[serde(default = "default_redis_cache_ttl_secs")]
pub redis_cache_ttl_secs: u64,
#[serde(default = "default_max_fetch_size_bytes")]
pub max_fetch_size_bytes: usize,
}
impl fmt::Display for IpfsConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"IpfsConfig: {}/<cid>?{} (fallback: {}, cache: {}, memory_size: {}, redis: {}, max_fetch: {})",
self.gateway,
self.params,
self.fallback_gateway,
self.cache_enabled,
self.memory_cache_size,
self.redis_cache_enabled,
self.max_fetch_size_bytes
)
}
}
impl Default for IpfsConfig {
fn default() -> Self {
Self {
gateway: std::env::var("IPFS_GATEWAY").unwrap_or(PUBLIC_IPFS_GATEWAY.to_string()),
params: std::env::var("IPFS_PARAMS").unwrap_or_default(),
fallback_gateway: default_fallback_gateway(),
cache_enabled: default_cache_enabled(),
memory_cache_size: default_memory_cache_size(),
memory_cache_ttl_secs: default_memory_cache_ttl_secs(),
redis_cache_enabled: default_redis_cache_enabled(),
redis_cache_ttl_secs: default_redis_cache_ttl_secs(),
max_fetch_size_bytes: default_max_fetch_size_bytes(),
}
}
}