use super::container;
use super::project::{path_is_project_root, project_root_path};
use super::resources::container::Container;
use super::resources::script::Scripts;
use crate::result::{ContainerError, Error, ProjectError, Result};
use settings_manager::list_setting::ListSetting;
use settings_manager::local_settings::LocalSettings;
use std::path::Path;
use thot_core::project::{Script, ScriptAssociation};
use thot_core::result::{Error as CoreError, ProjectError as CoreProjectError};
use thot_core::types::{ResourceId, ResourcePath};
pub fn init(path: &Path, project: Option<&Path>) -> Result<ResourceId> {
let project = match project {
None => project_root_path(path)?,
Some(p) => {
if !path_is_project_root(p) {
return Err(Error::ProjectError(ProjectError::PathNotAProjectRoot(
p.to_path_buf(),
)));
}
p.to_path_buf()
}
};
let s_rp = ResourcePath::new(path.to_path_buf())?;
let mut scripts = Scripts::load(&project)?;
for s in &scripts.scripts {
if s.path == s_rp {
return Ok(s.rid.clone());
}
}
let script = Script::new(s_rp)?;
let rid = script.rid.clone();
scripts.push(script);
scripts.save()?;
Ok(rid)
}
pub fn id_by_path(path: &Path, project: Option<&Path>) -> Result<ResourceId> {
let project = match project {
Some(p) => {
if !path_is_project_root(p) {
return Err(Error::ProjectError(ProjectError::PathNotAProjectRoot(
p.to_path_buf(),
)));
}
p.to_path_buf()
}
None => {
let p = project_root_path(path)?;
p
}
};
let scripts = Scripts::load(&project)?;
let s_path = ResourcePath::new(path.to_path_buf())?;
match scripts.by_path(&s_path) {
None => Err(Error::CoreError(CoreError::ProjectError(
CoreProjectError::NotRegistered(None, Some(path.to_path_buf())),
))),
Some(script) => Ok(script.rid.clone()),
}
}
pub fn path_is_registered(path: &Path, project: Option<&Path>) -> Result<bool> {
let project = match project {
Some(p) => {
if !path_is_project_root(p) {
return Err(Error::ProjectError(ProjectError::PathNotAProjectRoot(
p.to_path_buf(),
)));
}
p.to_path_buf()
}
None => {
let p = project_root_path(path)?;
p
}
};
let scripts = Scripts::load(&project)?;
let s_path = ResourcePath::new(path.to_path_buf())?;
Ok(scripts.contains_path(&s_path))
}
pub fn add_association(script: &Path, container: &Path) -> Result<ResourceId> {
if !container::path_is_container(container) {
return Err(Error::ContainerError(ContainerError::PathNotAContainer(
container.to_path_buf(),
)));
}
let prj_path = project_root_path(container)?;
let scripts = Scripts::load(&prj_path)?;
let s_path = ResourcePath::new(script.to_path_buf())?;
let script = match scripts.by_path(&s_path) {
Some(s) => s,
None => {
return Err(Error::CoreError(CoreError::ProjectError(
CoreProjectError::NotRegistered(None, Some(script.to_path_buf())),
)))
}
};
let mut container = Container::load(container)?;
let assoc = ScriptAssociation::new(script.rid.clone());
container.add_script_association(assoc)?;
container.save()?;
Ok(script.rid.clone())
}
#[cfg(test)]
#[path = "./script_test.rs"]
mod script_test;