cyber_std/
particle.rs

1use std::ops::Add;
2use std::str::FromStr;
3use cid::{Cid, Version};
4use cid::multihash::{Code, MultihashDigest};
5use thiserror::Error;
6
7pub fn prepare_particle(input: String) -> Result<Cid, ParticleError> {
8    if input.len() == 0 || input.len() > 256 {
9        return Err(ParticleError::InvalidParticleData {});
10    }
11
12    // unixfs/dagnode/proto shortcut
13    // wrap input bytes as a dagnode unixfs file
14    let length: u8 = input.len() as u8;
15    let mut raw: Vec<u8> = vec![10, length.add(6) as u8, 8, 2, 18, length];
16    raw.append(&mut input.as_bytes().to_vec());
17    raw.append(&mut vec![24, length]);
18
19    let h = Code::Sha2_256.digest(&raw.as_slice());
20    let particle = Cid::new_v0(h).unwrap();
21
22    Ok(particle)
23}
24
25pub fn check_particle(input: String) -> Result<Cid, ParticleError> {
26    let particle:Cid;
27    let try_particle = Cid::from_str(&input.clone());
28    if try_particle.is_ok() {
29        particle = try_particle.unwrap();
30        if particle.version() != Version::V0 {
31            return Err(ParticleError::InvalidParticleVersion {});
32        }
33    } else {
34        return Err(ParticleError::InvalidParticle {});
35    }
36
37    Ok(particle)
38}
39
40#[derive(Error, Debug, PartialEq)]
41pub enum ParticleError {
42    #[error("Invalid data for the particle")]
43    InvalidParticleData {},
44
45    #[error("Invalid particle")]
46    InvalidParticle {},
47
48    #[error("Invalid particle version")]
49    InvalidParticleVersion {},
50}
51