use crate::error::InvalidStateError;
use crate::public_key::PublicKey;
use super::ProposedNode;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CircuitNode {
id: String,
endpoints: Vec<String>,
public_key: Option<PublicKey>,
}
impl CircuitNode {
pub fn node_id(&self) -> &str {
&self.id
}
pub fn endpoints(&self) -> &[String] {
&self.endpoints
}
pub fn public_key(&self) -> &Option<PublicKey> {
&self.public_key
}
}
impl From<&ProposedNode> for CircuitNode {
fn from(proposed_node: &ProposedNode) -> Self {
CircuitNode {
id: proposed_node.node_id().into(),
endpoints: proposed_node.endpoints().to_vec(),
public_key: proposed_node.public_key().clone(),
}
}
}
impl From<ProposedNode> for CircuitNode {
fn from(node: ProposedNode) -> Self {
CircuitNode {
id: node.node_id().into(),
endpoints: node.endpoints().to_vec(),
public_key: node.public_key().clone(),
}
}
}
#[derive(Default, Clone)]
pub struct CircuitNodeBuilder {
node_id: Option<String>,
endpoints: Option<Vec<String>>,
public_key: Option<PublicKey>,
}
impl CircuitNodeBuilder {
pub fn new() -> Self {
CircuitNodeBuilder::default()
}
pub fn node_id(&self) -> Option<String> {
self.node_id.clone()
}
pub fn endpoints(&self) -> Option<Vec<String>> {
self.endpoints.clone()
}
pub fn public_key(&self) -> Option<PublicKey> {
self.public_key.clone()
}
pub fn with_node_id(mut self, node_id: &str) -> CircuitNodeBuilder {
self.node_id = Some(node_id.into());
self
}
pub fn with_endpoints(mut self, endpoints: &[String]) -> CircuitNodeBuilder {
self.endpoints = Some(endpoints.into());
self
}
pub fn with_public_key(mut self, public_key: &PublicKey) -> CircuitNodeBuilder {
self.public_key = Some(public_key.clone());
self
}
pub fn build(self) -> Result<CircuitNode, InvalidStateError> {
let node_id = self.node_id.ok_or_else(|| {
InvalidStateError::with_message("unable to build, missing field: `node_id`".to_string())
})?;
let mut endpoints = self.endpoints.ok_or_else(|| {
InvalidStateError::with_message(
"unable to build, missing field: `endpoints`".to_string(),
)
})?;
endpoints.sort();
let node = CircuitNode {
id: node_id,
endpoints,
public_key: self.public_key,
};
Ok(node)
}
}