Improve mapping error handling

feature/lookup-installed
trivernis 2 years ago
parent 7819312647
commit 203a211ee2
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG Key ID: DFFFCC2C7A02DB45

@ -1,4 +1,4 @@
use std::io; use std::{io, path::PathBuf};
use miette::Diagnostic; use miette::Diagnostic;
use thiserror::Error; use thiserror::Error;
@ -24,4 +24,12 @@ pub enum MapperError {
#[error("IO Error: {0}")] #[error("IO Error: {0}")]
Io(#[from] io::Error), Io(#[from] io::Error),
#[error("Failed to map directory {src:?}")]
DirMapping {
src: PathBuf,
#[source]
err: io::Error,
},
} }

@ -1,5 +1,6 @@
use std::{ use std::{
collections::HashSet, collections::HashSet,
io,
path::{Path, PathBuf}, path::{Path, PathBuf},
}; };
@ -7,7 +8,7 @@ use tokio::fs::{self, DirEntry};
use crate::{consts::BIN_DIR, repository::node_path::NodePath}; use crate::{consts::BIN_DIR, repository::node_path::NodePath};
use super::error::MapperResult; use super::error::{MapperError, MapperResult};
struct NodeApp { struct NodeApp {
info: DirEntry, info: DirEntry,
@ -30,11 +31,13 @@ impl NodeApp {
/// creates wrappers to map this application /// creates wrappers to map this application
pub async fn map_executable(&self) -> MapperResult<()> { pub async fn map_executable(&self) -> MapperResult<()> {
let src_path = BIN_DIR.join(self.info.file_name()); let src_path = BIN_DIR.join(self.info.file_name());
self.write_wrapper_script(&src_path).await self.write_wrapper_script(&src_path)
.await
.map_err(|err| MapperError::DirMapping { src: src_path, err })
} }
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
async fn write_wrapper_script(&self, path: &Path) -> MapperResult<()> { async fn write_wrapper_script(&self, path: &Path) -> Result<(), io::Error> {
fs::write(path, format!("#!/bin/sh\nnenv exec {} \"$@\"", self.name)).await?; fs::write(path, format!("#!/bin/sh\nnenv exec {} \"$@\"", self.name)).await?;
let src_metadata = self.info.metadata().await?; let src_metadata = self.info.metadata().await?;
fs::set_permissions(&path, src_metadata.permissions()).await?; fs::set_permissions(&path, src_metadata.permissions()).await?;
@ -43,7 +46,7 @@ impl NodeApp {
} }
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
async fn write_wrapper_script(&self, path: &Path) -> MapperResult<()> { async fn write_wrapper_script(&self, path: &Path) -> Result<(), io::Error> {
fs::write( fs::write(
path.with_extension("bat"), path.with_extension("bat"),
format!("nenv exec {} %*", self.name), format!("nenv exec {} %*", self.name),
@ -74,7 +77,12 @@ pub async fn map_node_bin(node_path: NodePath) -> MapperResult<()> {
async fn get_applications(path: &PathBuf) -> MapperResult<Vec<NodeApp>> { async fn get_applications(path: &PathBuf) -> MapperResult<Vec<NodeApp>> {
let mut files = Vec::new(); let mut files = Vec::new();
let mut iter = fs::read_dir(path).await?; let mut iter = fs::read_dir(path)
.await
.map_err(|err| MapperError::DirMapping {
src: path.to_owned(),
err,
})?;
while let Some(entry) = iter.next_entry().await? { while let Some(entry) = iter.next_entry().await? {
if entry.path().is_file() { if entry.path().is_file() {

Loading…
Cancel
Save