summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/workspace_command.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/workspace_command.rs')
-rw-r--r--support/texlab/src/features/workspace_command.rs106
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;