Skip to main content

typhoon_discriminator/
lib.rs

1#![no_std]
2
3use const_crypto::sha2::Sha256;
4
5pub struct DiscriminatorBuilder<'a> {
6    pub name: &'a str,
7    pub layout_version: u8,
8}
9
10impl<'a> DiscriminatorBuilder<'a> {
11    pub const fn new(name: &'a str) -> Self {
12        DiscriminatorBuilder {
13            name,
14            layout_version: 1,
15        }
16    }
17
18    pub const fn layout(mut self, version: u8) -> Self {
19        self.layout_version = version;
20        self
21    }
22
23    pub const fn build(self) -> [u8; 8] {
24        let hasher = Sha256::new().update(self.name.as_bytes());
25        let [b0, b1, b2, b3, ..] = hasher.finalize();
26
27        [b0, b1, b2, b3, self.layout_version, 0, 0, 0]
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn discriminator_test() {
37        let discriminator = DiscriminatorBuilder::new("state").build();
38        let expected = [75, 166, 151, 53, 1, 0, 0, 0];
39
40        assert_eq!(discriminator, expected);
41
42        let discriminator = DiscriminatorBuilder::new("state").layout(2).build();
43        let expected = [75, 166, 151, 53, 2, 0, 0, 0];
44
45        assert_eq!(discriminator, expected);
46    }
47}