1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use crate::error::MangoError;
use anchor_lang::prelude::*;
#[macro_export]
macro_rules! zip {
($x: expr) => ($x);
($x: expr, $($y: expr), +) => (
$x.zip(
zip!($($y), +))
)
}
#[allow(unused_imports)]
pub(crate) use zip;
pub fn fill_from_str<const N: usize>(name: &str) -> Result<[u8; N]> {
let name_bytes = name.as_bytes();
require!(name_bytes.len() <= N, MangoError::SomeError);
let mut name_ = [0u8; N];
name_[..name_bytes.len()].copy_from_slice(name_bytes);
Ok(name_)
}
pub fn format_zero_terminated_utf8_bytes(
name: &[u8],
fmt: &mut std::fmt::Formatter,
) -> std::result::Result<(), std::fmt::Error> {
fmt.write_str(
std::str::from_utf8(name)
.unwrap()
.trim_matches(char::from(0)),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fill_from_str() {
assert_eq!(fill_from_str::<4>(""), Ok([0, 0, 0, 0]));
assert_eq!(
fill_from_str::<4>("abc"),
Ok(['a' as u8, 'b' as u8, 'c' as u8, 0])
);
assert_eq!(
fill_from_str::<4>("abcd"),
Ok(['a' as u8, 'b' as u8, 'c' as u8, 'd' as u8])
);
assert!(fill_from_str::<4>("abcde").is_err());
}
}