typhoon_discriminator/
lib.rs1#![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}