uuinfo 0.3.10

A tool to debug unique identifiers (UUID, ULID, Snowflake, etc).
use cid::{Cid, Version};
use std::fmt::Write;
use std::str::FromStr;

use crate::schema::{Args, IDInfo};

pub fn parse_ipfs(args: &Args) -> Option<IDInfo> {
    let cid = Cid::from_str(&args.id).ok()?;
    let (version, parsed) = match (cid.version(), cid.codec()) {
        (Version::V0, _) => ("CID v0", "from base58btc"),
        (Version::V1, 114) => ("CID v1 (IPNS)", "from base32"),
        (Version::V1, _) => ("CID v1", "from base32"),
    };
    let version_map = (cid.encoded_len() - cid.hash().size() as usize) * 8;
    let entropy_map = cid.hash().size() as usize * 8;

    Some(IDInfo {
        id_type: "IPFS".to_string(),
        version: Some(version.to_string()),
        standard: args.id.to_string(),
        parsed: Some(parsed.to_string()),
        size: (cid.encoded_len() * 8) as u16,
        entropy: (cid.hash().size() as u16 * 8),
        hex: Some(hex::encode(cid.to_bytes())),
        bits: Some(cid.to_bytes().iter().fold(String::new(), |mut output, c| {
            let _ = write!(output, "{c:08b}");
            output
        })),
        color_map: Some(format!(
            "{}{}",
            (0..(version_map)).map(|_| "1").collect::<String>(),
            (0..(entropy_map)).map(|_| "2").collect::<String>()
        )),

        ..Default::default()
    })
}