z4_types/
utils.rs

1use ethabi::{encode, Token};
2use ethereum_types::{Address, H160};
3use serde_json::Value;
4use tdn_types::primitives::PeerId;
5
6use crate::{Error, Result};
7
8/// Room id = u64
9pub type RoomId = u64;
10
11/// Game id = Address
12pub type GameId = Address;
13
14/// Z4 init room id/tdn group id
15pub const Z4_ROOM_MARKET_GROUP: RoomId = 4;
16
17/// convert address to peer
18#[inline]
19pub fn address_to_peer(addr: Address) -> PeerId {
20    PeerId(addr.0)
21}
22
23/// convert peer to address
24#[inline]
25pub fn peer_to_address(peer: PeerId) -> Address {
26    H160(peer.0)
27}
28
29/// Helper for generate simple game result, for ranking
30pub fn simple_game_result(ranks: &[Address]) -> Vec<u8> {
31    encode(&[Token::Array(
32        ranks.iter().map(|v| Token::Address(*v)).collect(),
33    )])
34}
35
36/// Convert address to hex string
37pub fn address_hex(a: &Address) -> String {
38    PeerId(a.to_fixed_bytes()).to_hex()
39}
40
41/// Convert hex string to address
42pub fn hex_address(v: &str) -> Result<Address> {
43    if let Ok(v) = hex::decode(v.trim_start_matches("0x")) {
44        if v.len() != 20 {
45            return Err(Error::Anyhow("address invalid".to_owned()));
46        }
47        let mut bytes = [0u8; 20];
48        bytes.copy_from_slice(&v);
49        Ok(H160(bytes))
50    } else {
51        Err(Error::Anyhow("address invalid".to_owned()))
52    }
53}
54
55/// Get value from env and parse it to T
56pub fn env_value<T: std::str::FromStr>(key: &str, default: Option<T>) -> Result<T> {
57    match (std::env::var(key), default) {
58        (Ok(v), _) => v
59            .parse()
60            .map_err(|_| Error::Anyhow(key.to_owned() + " env invalid")),
61        (Err(_), Some(v)) => Ok(v),
62        (Err(_), None) => return Err(Error::Anyhow(key.to_owned() + " env missing")),
63    }
64}
65
66/// Get value array from env and parse it to T
67pub fn env_values<T: std::str::FromStr>(key: &str, default: Option<Vec<T>>) -> Result<Vec<T>> {
68    match (std::env::var(key), default) {
69        (Ok(v), default) => {
70            let mut items = vec![];
71            for item in v.split(",") {
72                items.push(
73                    item.parse()
74                        .map_err(|_| Error::Anyhow(key.to_owned() + " env invalid"))?,
75                );
76            }
77            if items.is_empty() {
78                if let Some(d) = default {
79                    Ok(d)
80                } else {
81                    Err(Error::Anyhow(key.to_owned() + " env invalid"))
82                }
83            } else {
84                Ok(items)
85            }
86        }
87        (Err(_), Some(v)) => Ok(v),
88        (Err(_), None) => return Err(Error::Anyhow(key.to_owned() + " env missing")),
89    }
90}
91
92/// Merge two values
93pub fn merge_json(a: &mut Value, b: &Value) {
94    match (a, b) {
95        (&mut Value::Object(ref mut a), Value::Object(b)) => {
96            for (k, v) in b {
97                merge_json(a.entry(k.clone()).or_insert(Value::Null), v);
98            }
99        }
100        (a, b) => {
101            *a = b.clone();
102        }
103    }
104}