use serde::{Deserialize, Serialize};
use uuid::{uuid, Uuid};
use super::arguments::Arguments;
use super::command_kind::CommandKind;
use super::parameters::Parameters;
use super::range::Range;
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum AnchorKind {
Begin,
End,
}
impl ToString for AnchorKind {
fn to_string(&self) -> String {
match self {
AnchorKind::Begin => "begin".to_string(),
AnchorKind::End => "end".to_string(),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Anchor {
pub command: CommandKind,
pub uuid: Uuid,
pub kind: AnchorKind,
pub status: Option<String>,
pub parameters: Parameters,
pub arguments: Arguments,
pub range: Range,
}
impl Anchor {
pub fn new_couple(
command: CommandKind,
status: Option<String>,
parameters: &Parameters,
arguments: &Arguments,
) -> (Anchor, Anchor) {
let uuid = Uuid::new_v4();
let begin = Anchor {
command,
uuid,
kind: AnchorKind::Begin,
status: status,
parameters: parameters.clone(),
arguments: arguments.clone(),
range: Range::null(),
};
let end = Anchor {
command,
uuid,
kind: AnchorKind::End,
status: None,
parameters: Parameters::new(),
arguments: Arguments::new(),
range: Range::null(),
};
(begin, end)
}
pub fn invalid() -> Self {
Anchor {
command: CommandKind::Tag,
uuid: uuid!("00000000-0000-0000-0000-000000000000"),
kind: AnchorKind::Begin,
status: None,
parameters: Parameters::new(),
arguments: Arguments::new(),
range: Range::null(),
}
}
pub fn update(&self, parameters: &Parameters, arguments: &Arguments) -> Self {
let mut anchor = self.clone();
anchor.parameters = anchor.parameters.update(parameters);
anchor.arguments = anchor.arguments.update(arguments);
anchor
}
pub fn set_status(mut self, new_status: String) -> Self {
self.status = Some(new_status);
self
}
}
impl ToString for Anchor {
fn to_string(&self) -> String {
format!(
"<!-- {}-{}:{} {} {} {} -->",
self.command.to_string(),
self.uuid.to_string(),
self.kind.to_string(),
match &self.status {
None => format!(""),
Some(x) => format!("+{}+", x),
},
self.parameters.to_string(),
self.arguments.to_string(),
)
}
}