1use rnix::TextRange;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Hash, Eq, Deserialize, Serialize, PartialOrd, Ord)]
5pub struct Input {
6 pub(crate) id: String,
7 pub(crate) flake: bool,
8 pub(crate) url: String,
9 pub(crate) follows: Vec<Follows>,
10 pub range: Range,
11}
12
13#[derive(Debug, Default, Clone, PartialEq, Hash, Eq, Deserialize, Serialize, PartialOrd, Ord)]
14pub struct Range {
15 pub start: usize,
16 pub end: usize,
17}
18
19impl Range {
20 pub fn from_text_range(text_range: TextRange) -> Self {
21 Self {
22 start: text_range.start().into(),
23 end: text_range.end().into(),
24 }
25 }
26}
27
28#[derive(Debug, Clone, PartialEq, Hash, Eq, Deserialize, Serialize, PartialOrd, Ord)]
29pub enum Follows {
30 Indirect(String, String),
32 Direct(String, Input),
34}
35
36impl Default for Input {
37 fn default() -> Self {
38 Self {
39 id: String::new(),
40 flake: true,
41 url: String::new(),
42 follows: vec![],
43 range: Range::default(),
44 }
45 }
46}
47
48impl Input {
49 pub(crate) fn new(name: String) -> Self {
50 Self {
51 id: name,
52 ..Self::default()
53 }
54 }
55
56 pub(crate) fn with_url(id: String, url: String, text_range: TextRange) -> Self {
58 Self {
59 id,
60 url,
61 range: Range::from_text_range(text_range),
62 ..Self::default()
63 }
64 }
65
66 pub fn id(&self) -> &str {
67 self.id.as_ref()
68 }
69 pub fn url(&self) -> &str {
70 self.url.as_ref()
71 }
72 pub fn follows(&self) -> &Vec<Follows> {
73 self.follows.as_ref()
74 }
75}