yaml_edit/nodes/
directive.rs1use super::{Lang, SyntaxNode};
2use crate::lex::SyntaxKind;
3use rowan::ast::AstNode;
4use rowan::GreenNodeBuilder;
5
6ast_node!(Directive, DIRECTIVE, "A YAML directive like %YAML 1.2");
7
8impl Directive {
9 pub fn text(&self) -> String {
11 self.0.text().to_string()
12 }
13
14 pub fn name(&self) -> Option<String> {
16 let text = self.text();
17 if let Some(directive_content) = text.strip_prefix('%') {
18 directive_content
19 .split_whitespace()
20 .next()
21 .map(|s| s.to_string())
22 } else {
23 None
24 }
25 }
26
27 pub fn value(&self) -> Option<String> {
29 let text = self.text();
30 if let Some(directive_content) = text.strip_prefix('%') {
31 let parts: Vec<&str> = directive_content.split_whitespace().collect();
32 if parts.len() > 1 {
33 Some(parts[1..].join(" "))
34 } else {
35 None
36 }
37 } else {
38 None
39 }
40 }
41
42 pub fn is_yaml_version(&self) -> bool {
44 self.name().as_deref() == Some("YAML")
45 }
46
47 pub fn is_tag(&self) -> bool {
49 self.name().as_deref() == Some("TAG")
50 }
51
52 pub fn new_yaml_version(version: &str) -> Self {
54 let directive_text = format!("%YAML {version}");
55 let mut builder = GreenNodeBuilder::new();
56 builder.start_node(SyntaxKind::DIRECTIVE.into());
57 builder.token(SyntaxKind::DIRECTIVE.into(), &directive_text);
58 builder.finish_node();
59 Directive(SyntaxNode::new_root_mut(builder.finish()))
60 }
61
62 pub fn new_tag(handle: &str, prefix: &str) -> Self {
64 let directive_text = format!("%TAG {handle} {prefix}");
65 let mut builder = GreenNodeBuilder::new();
66 builder.start_node(SyntaxKind::DIRECTIVE.into());
67 builder.token(SyntaxKind::DIRECTIVE.into(), &directive_text);
68 builder.finish_node();
69 Directive(SyntaxNode::new_root_mut(builder.finish()))
70 }
71}