solana_farm_sdk/
string.rs

1//! Fixed length string types
2
3//use arrayvec::ArrayString;
4use {
5    arraystring::{typenum::U64, ArrayString},
6    serde::Serialize,
7    solana_program::{instruction::Instruction, program_error::ProgramError, pubkey::Pubkey},
8    std::collections::HashMap,
9};
10
11/// Fixed size array to store UTF-8 strings on blockchain.
12pub type ArrayString64 = ArrayString<U64>;
13
14pub fn to_pretty_json<T>(object: &T) -> Result<String, serde_json::Error>
15where
16    T: ?Sized + Serialize,
17{
18    serde_json::to_string_pretty(&object)
19}
20
21// Custom serializer that prints base58 addresses instead of arrays
22pub fn instruction_to_string(inst: &Instruction) -> String {
23    let len = 145 + inst.data.len() * 4 + inst.accounts.len() * 40;
24    let mut s = String::with_capacity(len);
25    s += format!("{{\"program_id\":\"{}\",\"accounts\":[", inst.program_id).as_str();
26    let mut first_object = true;
27    for val in &inst.accounts {
28        if !first_object {
29            s += ",";
30        } else {
31            first_object = false;
32        }
33        s += format!(
34            "{{\"pubkey\":\"{}\",\"is_signer\":{},\"is_writable\":{}}}",
35            val.pubkey, val.is_signer, val.is_writable
36        )
37        .as_str();
38    }
39    s += format!("],\"data\":{:?}}}", inst.data).as_str();
40    s
41}
42
43// Custom serializer that prints base58 addresses instead of arrays
44pub fn pubkey_map_to_string(map: &HashMap<String, Pubkey>) -> String {
45    if map.is_empty() {
46        return "{}".to_string();
47    }
48    let mut len = 1;
49    for key in map.keys() {
50        len += key.len() + 50;
51    }
52    let mut s = String::with_capacity(len);
53    s += "{";
54    for (key, val) in map {
55        if s.len() != 1 {
56            s += ",";
57        }
58        s += format!("\"{}\":\"{}\"", key, val).as_str();
59    }
60    s += "}";
61    s
62}
63
64pub fn str_to_as64(input: &str) -> Result<ArrayString64, ProgramError> {
65    ArrayString64::try_from_str(input).or(Err(ProgramError::InvalidArgument))
66}
67
68pub fn capitalize(s: &str) -> String {
69    let mut c = s.chars();
70    match c.next() {
71        None => String::new(),
72        Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
73    }
74}