1use ethabi::{encode, Token};
2use ethereum_types::{Address, H160};
3use serde_json::Value;
4use tdn_types::primitives::PeerId;
5
6use crate::{Error, Result};
7
8pub type RoomId = u64;
10
11pub type GameId = Address;
13
14pub const Z4_ROOM_MARKET_GROUP: RoomId = 4;
16
17#[inline]
19pub fn address_to_peer(addr: Address) -> PeerId {
20 PeerId(addr.0)
21}
22
23#[inline]
25pub fn peer_to_address(peer: PeerId) -> Address {
26 H160(peer.0)
27}
28
29pub fn simple_game_result(ranks: &[Address]) -> Vec<u8> {
31 encode(&[Token::Array(
32 ranks.iter().map(|v| Token::Address(*v)).collect(),
33 )])
34}
35
36pub fn address_hex(a: &Address) -> String {
38 PeerId(a.to_fixed_bytes()).to_hex()
39}
40
41pub 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
55pub 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
66pub 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
92pub 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}