use num_traits::Zero;
use starknet_types_core::felt::Felt as Felt252;
pub fn as_cairo_short_string(value: &Felt252) -> Option<String> {
let mut as_string = String::default();
let mut is_end = false;
for byte in value.to_biguint().to_bytes_be() {
if byte == 0 {
is_end = true;
} else if is_end {
return None;
} else if byte.is_ascii_graphic() || byte.is_ascii_whitespace() {
as_string.push(byte as char);
} else {
return None;
}
}
Some(as_string)
}
pub fn as_cairo_short_string_ex(value: &Felt252, length: usize) -> Option<String> {
if length == 0 {
return if value.is_zero() { Some(String::new()) } else { None };
}
if length > 31 {
return None;
}
let bytes = value.to_biguint().to_bytes_be();
let bytes_len = bytes.len();
if bytes_len > length {
return None;
}
let mut as_string = String::new();
for byte in bytes {
if byte == 0 {
as_string.push_str(r"\0");
} else if byte.is_ascii_graphic() || byte.is_ascii_whitespace() {
as_string.push(byte as char);
} else {
as_string.push_str(format!(r"\x{byte:02x}").as_str());
}
}
let missing_nulls = length - bytes_len;
as_string.insert_str(0, &r"\0".repeat(missing_nulls));
Some(as_string)
}