thot_local/project/
script.rs1use super::container;
2use super::project::{path_is_project_root, project_root_path};
3use super::resources::container::Container;
4use super::resources::script::Scripts;
5use crate::result::{ContainerError, Error, ProjectError, Result};
6use settings_manager::list_setting::ListSetting;
7use settings_manager::local_settings::LocalSettings;
8use std::path::Path;
9use thot_core::project::{Script, ScriptAssociation};
10use thot_core::result::{Error as CoreError, ProjectError as CoreProjectError};
11use thot_core::types::{ResourceId, ResourcePath};
12
13pub fn init(path: &Path, project: Option<&Path>) -> Result<ResourceId> {
21 let project = match project {
22 None => project_root_path(path)?,
23 Some(p) => {
24 if !path_is_project_root(p) {
26 return Err(Error::ProjectError(ProjectError::PathNotAProjectRoot(
27 p.to_path_buf(),
28 )));
29 }
30
31 p.to_path_buf()
32 }
33 };
34
35 let s_rp = ResourcePath::new(path.to_path_buf())?;
36 let mut scripts = Scripts::load(&project)?;
37
38 for s in &scripts.scripts {
40 if s.path == s_rp {
41 return Ok(s.rid.clone());
42 }
43 }
44
45 let script = Script::new(s_rp)?;
46 let rid = script.rid.clone();
47 scripts.push(script);
48 scripts.save()?;
49
50 Ok(rid)
51}
52
53pub fn id_by_path(path: &Path, project: Option<&Path>) -> Result<ResourceId> {
57 let project = match project {
59 Some(p) => {
60 if !path_is_project_root(p) {
61 return Err(Error::ProjectError(ProjectError::PathNotAProjectRoot(
62 p.to_path_buf(),
63 )));
64 }
65 p.to_path_buf()
66 }
67 None => {
68 let p = project_root_path(path)?;
69 p
70 }
71 };
72
73 let scripts = Scripts::load(&project)?;
74 let s_path = ResourcePath::new(path.to_path_buf())?;
75 match scripts.by_path(&s_path) {
76 None => Err(Error::CoreError(CoreError::ProjectError(
77 CoreProjectError::NotRegistered(None, Some(path.to_path_buf())),
78 ))),
79 Some(script) => Ok(script.rid.clone()),
80 }
81}
82
83pub fn path_is_registered(path: &Path, project: Option<&Path>) -> Result<bool> {
86 let project = match project {
88 Some(p) => {
89 if !path_is_project_root(p) {
90 return Err(Error::ProjectError(ProjectError::PathNotAProjectRoot(
91 p.to_path_buf(),
92 )));
93 }
94 p.to_path_buf()
95 }
96 None => {
97 let p = project_root_path(path)?;
98 p
99 }
100 };
101
102 let scripts = Scripts::load(&project)?;
104 let s_path = ResourcePath::new(path.to_path_buf())?;
105 Ok(scripts.contains_path(&s_path))
106}
107
108pub fn add_association(script: &Path, container: &Path) -> Result<ResourceId> {
122 if !container::path_is_container(container) {
124 return Err(Error::ContainerError(ContainerError::PathNotAContainer(
125 container.to_path_buf(),
126 )));
127 }
128
129 let prj_path = project_root_path(container)?;
131 let scripts = Scripts::load(&prj_path)?;
132 let s_path = ResourcePath::new(script.to_path_buf())?;
133 let script = match scripts.by_path(&s_path) {
134 Some(s) => s,
135 None => {
136 return Err(Error::CoreError(CoreError::ProjectError(
137 CoreProjectError::NotRegistered(None, Some(script.to_path_buf())),
138 )))
139 }
140 };
141
142 let mut container = Container::load(container)?;
144 let assoc = ScriptAssociation::new(script.rid.clone());
145 container.add_script_association(assoc)?;
146 container.save()?;
147
148 Ok(script.rid.clone())
149}
150
151#[cfg(test)]
152#[path = "./script_test.rs"]
153mod script_test;