ferripfs-config 0.1.0

IPFS node configuration types, compatible with Kubo config format
Documentation
// Ported from: kubo/config/addresses.go
// Kubo version: v0.39.0
// Original: https://github.com/ipfs/kubo/blob/v0.39.0/config/addresses.go
//
// Original work: Copyright (c) Protocol Labs, Inc.
// Port: Copyright (c) 2026 ferripfs contributors
// SPDX-License-Identifier: MIT OR Apache-2.0

//! Address configuration for swarm, API, and gateway.

use crate::Strings;
use serde::{Deserialize, Serialize};

/// Addresses configuration section
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Addresses {
    /// Swarm listening addresses (multiaddr format)
    #[serde(default)]
    pub swarm: Vec<String>,

    /// Addresses to announce to the network
    #[serde(default)]
    pub announce: Vec<String>,

    /// Additional addresses to append to announce list
    #[serde(default)]
    pub append_announce: Vec<String>,

    /// Addresses to never announce
    #[serde(default)]
    pub no_announce: Vec<String>,

    /// API server address (multiaddr format)
    #[serde(default, rename = "API")]
    pub api: Strings,

    /// Gateway server address (multiaddr format)
    #[serde(default)]
    pub gateway: Strings,
}

impl Addresses {
    /// Get default swarm addresses
    pub fn default_swarm_addresses() -> Vec<String> {
        vec![
            "/ip4/0.0.0.0/tcp/4001".to_string(),
            "/ip6/::/tcp/4001".to_string(),
            "/ip4/0.0.0.0/udp/4001/quic-v1".to_string(),
            "/ip4/0.0.0.0/udp/4001/quic-v1/webtransport".to_string(),
            "/ip6/::/udp/4001/quic-v1".to_string(),
            "/ip6/::/udp/4001/quic-v1/webtransport".to_string(),
        ]
    }

    /// Get default API address
    pub fn default_api_address() -> String {
        "/ip4/127.0.0.1/tcp/5001".to_string()
    }

    /// Get default gateway address
    pub fn default_gateway_address() -> String {
        "/ip4/127.0.0.1/tcp/8080".to_string()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_addresses_default() {
        let addrs = Addresses::default();
        assert!(addrs.swarm.is_empty());
        assert!(addrs.api.is_empty());
    }

    #[test]
    fn test_default_swarm_addresses() {
        let swarm = Addresses::default_swarm_addresses();
        assert!(!swarm.is_empty());
        assert!(swarm.iter().any(|a| a.contains("tcp/4001")));
    }
}