diff options
Diffstat (limited to 'support/texlab/src/features/workspace_command.rs')
-rw-r--r-- | support/texlab/src/features/workspace_command.rs | 106 |
1 files changed, 3 insertions, 103 deletions
diff --git a/support/texlab/src/features/workspace_command.rs b/support/texlab/src/features/workspace_command.rs index 8d6732cd1c..cac998125e 100644 --- a/support/texlab/src/features/workspace_command.rs +++ b/support/texlab/src/features/workspace_command.rs @@ -1,103 +1,3 @@ -use std::process::Stdio; - -use anyhow::{bail, Result}; -use lsp_types::{TextDocumentIdentifier, Url}; -use thiserror::Error; - -use crate::{db::Workspace, normalize_uri, Db}; - -pub fn select(db: &dyn Db, name: &str, args: Vec<serde_json::Value>) -> Result<CleanCommand> { - Ok(match name { - "texlab.cleanAuxiliary" => CleanCommand::new(db, CleanOptions::Auxiliary, args)?, - "texlab.cleanArtifacts" => CleanCommand::new(db, CleanOptions::Artifacts, args)?, - _ => bail!("Unknown command: {}", name), - }) -} - -#[derive(Debug, Error)] -pub enum CleanError { - #[error("document '{0}' not found")] - DocumentNotFound(Url), - - #[error("document '{0}' is not a local file")] - NoLocalFile(Url), - - #[error("document was not provided as an argument")] - MissingArg, - - #[error("invalid argument: {0}")] - InvalidArg(serde_json::Error), - - #[error("failed to spawn process: {0}")] - Spawn(std::io::Error), -} - -#[derive(Debug)] -pub struct CleanCommand { - executable: String, - args: Vec<String>, -} - -impl CleanCommand { - fn new(db: &dyn Db, options: CleanOptions, args: Vec<serde_json::Value>) -> Result<Self> { - let params: TextDocumentIdentifier = - serde_json::from_value(args.into_iter().next().ok_or(CleanError::MissingArg)?) - .map_err(CleanError::InvalidArg)?; - - let mut uri = params.uri; - normalize_uri(&mut uri); - - let workspace = Workspace::get(db); - - let document = workspace - .lookup_uri(db, &uri) - .ok_or_else(|| CleanError::DocumentNotFound(uri.clone()))?; - - let working_dir = workspace.working_dir(db, document.directory(db)); - - let output_dir = workspace - .output_dir(db, working_dir) - .path(db) - .as_deref() - .ok_or_else(|| CleanError::NoLocalFile(uri.clone()))?; - - let path = document - .location(db) - .path(db) - .as_deref() - .ok_or_else(|| CleanError::NoLocalFile(uri.clone()))?; - - let flag = match options { - CleanOptions::Auxiliary => "-c", - CleanOptions::Artifacts => "-C", - }; - - let executable = "latexmk".to_string(); - let args = vec![ - format!("-outdir={}", output_dir.display()), - flag.to_string(), - path.display().to_string(), - ]; - - Ok(Self { executable, args }) - } - - pub fn run(self) -> Result<(), CleanError> { - log::debug!("Cleaning output files: {} {:?}", self.executable, self.args); - std::process::Command::new(self.executable) - .args(self.args) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .status() - .map_err(CleanError::Spawn)?; - - Ok(()) - } -} - -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)] -enum CleanOptions { - Auxiliary, - Artifacts, -} +pub mod change_environment; +pub mod clean; +pub mod dep_graph; |