typhoon-discriminator 0.1.0

TODO
Documentation
#![no_std]

use sha2::{Digest, Sha256};

pub struct DiscriminatorBuilder<'a> {
    pub name: &'a str,
    pub layout_version: u8,
}

impl<'a> DiscriminatorBuilder<'a> {
    pub fn new(name: &'a str) -> Self {
        DiscriminatorBuilder {
            name,
            layout_version: 1,
        }
    }

    pub fn layout(mut self, version: u8) -> Self {
        self.layout_version = version;
        self
    }

    pub fn build(self) -> [u8; 8] {
        let mut hasher = Sha256::new();
        hasher.update(self.name);
        let hash = hasher.finalize();

        let mut discriminator = [0; 8];
        discriminator[..4].copy_from_slice(&hash[..4]);
        discriminator[4] = self.layout_version;

        discriminator
    }
}

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

    #[test]
    fn discriminator_test() {
        let discriminator = DiscriminatorBuilder::new("state").build();
        let expected = [75, 166, 151, 53, 1, 0, 0, 0];

        assert_eq!(discriminator, expected);

        let discriminator = DiscriminatorBuilder::new("state").layout(2).build();
        let expected = [75, 166, 151, 53, 2, 0, 0, 0];

        assert_eq!(discriminator, expected);
    }
}