use rand::Rng;
fn suffix26() -> String {
const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let mut rng = rand::thread_rng();
(0..26)
.map(|_| ALPHABET[rng.gen_range(0..ALPHABET.len())] as char)
.collect()
}
pub fn new_network_id() -> String {
format!("n-{}", suffix26())
}
pub fn new_member_id() -> String {
format!("m-{}", suffix26())
}
pub fn new_node_id() -> String {
format!("nd-{}", suffix26())
}
pub fn new_proposal_id() -> String {
format!("p-{}", suffix26())
}
pub fn new_invitation_id() -> String {
format!("i-{}", suffix26())
}
pub fn new_accessor_id() -> String {
uuid::Uuid::new_v4().to_string()
}
pub fn new_billing_token() -> String {
const ALPHABET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let mut rng = rand::thread_rng();
(0..40)
.map(|_| ALPHABET[rng.gen_range(0..ALPHABET.len())] as char)
.collect()
}
pub fn network_arn(id: &str) -> String {
format!("arn:aws:managedblockchain:::networks/{id}")
}
pub fn member_arn(region: &str, account: &str, id: &str) -> String {
format!("arn:aws:managedblockchain:{region}:{account}:members/{id}")
}
pub fn node_arn(region: &str, account: &str, id: &str) -> String {
format!("arn:aws:managedblockchain:{region}:{account}:nodes/{id}")
}
pub fn proposal_arn(region: &str, account: &str, id: &str) -> String {
format!("arn:aws:managedblockchain:{region}:{account}:proposals/{id}")
}
pub fn invitation_arn(region: &str, account: &str, id: &str) -> String {
format!("arn:aws:managedblockchain:{region}:{account}:invitations/{id}")
}
pub fn accessor_arn(region: &str, account: &str, id: &str) -> String {
format!("arn:aws:managedblockchain:{region}:{account}:accessors/{id}")
}
pub fn iso_now() -> String {
chrono::Utc::now()
.format("%Y-%m-%dT%H:%M:%S%.3fZ")
.to_string()
}
pub fn fabric_ordering_endpoint(network_id: &str, region: &str) -> String {
let short = network_id.trim_start_matches("n-").to_lowercase();
format!("orderer.{short}.managedblockchain.{region}.amazonaws.com:30001")
}
pub fn fabric_ca_endpoint(member_id: &str, region: &str) -> String {
let short = member_id.trim_start_matches("m-").to_lowercase();
format!("ca.{short}.managedblockchain.{region}.amazonaws.com:30002")
}
pub fn fabric_peer_endpoint(node_id: &str, region: &str) -> String {
let short = node_id.trim_start_matches("nd-").to_lowercase();
format!("{short}.managedblockchain.{region}.amazonaws.com:30003")
}
pub fn fabric_peer_event_endpoint(node_id: &str, region: &str) -> String {
let short = node_id.trim_start_matches("nd-").to_lowercase();
format!("{short}.managedblockchain.{region}.amazonaws.com:30004")
}
pub fn ethereum_http_endpoint(node_id: &str, region: &str) -> String {
let short = node_id.trim_start_matches("nd-").to_lowercase();
format!("https://{short}.ethereum.managedblockchain.{region}.amazonaws.com")
}
pub fn ethereum_ws_endpoint(node_id: &str, region: &str) -> String {
let short = node_id.trim_start_matches("nd-").to_lowercase();
format!("wss://{short}.wss.ethereum.managedblockchain.{region}.amazonaws.com")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ids_have_expected_prefixes() {
assert!(new_network_id().starts_with("n-"));
assert_eq!(new_network_id().len(), 28);
assert!(new_member_id().starts_with("m-"));
assert!(new_node_id().starts_with("nd-"));
assert!(new_proposal_id().starts_with("p-"));
assert!(new_invitation_id().starts_with("i-"));
assert_eq!(new_accessor_id().len(), 36);
assert_eq!(new_billing_token().len(), 40);
}
}