From bc4e620e56a00d15191c5736589639bfa7e1acbb Mon Sep 17 00:00:00 2001 From: Sergio Gasquez Date: Wed, 5 Oct 2022 12:53:43 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20=E2=99=BB=EF=B8=8F=20Add=20toolchai?= =?UTF-8?q?n=20module=20and=20remove=20utils.rs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib.rs | 15 +++++ src/main.rs | 95 +++++++++++++++++++++------ src/targets.rs | 28 ++++---- src/{ => toolchain}/espidf.rs | 12 ++-- src/{ => toolchain}/gcc_toolchain.rs | 9 +-- src/{ => toolchain}/llvm_toolchain.rs | 9 +-- src/{utils.rs => toolchain/mod.rs} | 75 ++------------------- src/{ => toolchain}/rust_toolchain.rs | 7 +- 8 files changed, 134 insertions(+), 116 deletions(-) create mode 100644 src/lib.rs rename src/{ => toolchain}/espidf.rs (97%) rename src/{ => toolchain}/gcc_toolchain.rs (97%) rename src/{ => toolchain}/llvm_toolchain.rs (97%) rename src/{utils.rs => toolchain/mod.rs} (58%) rename src/{ => toolchain}/rust_toolchain.rs (99%) diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8c9c467 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,15 @@ +pub mod emoji; +pub mod targets; +pub mod toolchain; +pub mod logging { + use env_logger::{Builder, Env, WriteStyle}; + + /// Initializes the logger + pub fn initialize_logger(log_level: &str) { + Builder::from_env(Env::default().default_filter_or(log_level)) + .format_target(false) + .format_timestamp_secs() + .write_style(WriteStyle::Always) + .init(); + } +} diff --git a/src/main.rs b/src/main.rs index b84727a..5a3bef2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,26 +1,29 @@ -use crate::espidf::{get_install_path, get_tool_path, EspIdfRepo}; -use crate::gcc_toolchain::install_gcc_targets; -use crate::llvm_toolchain::LlvmToolchain; -use crate::rust_toolchain::{ - check_rust_installation, get_rustup_home, install_riscv_target, RustCrate, RustToolchain, -}; -use crate::targets::{parse_targets, Target}; -#[cfg(windows)] -use crate::utils::check_arguments; -use crate::utils::{clear_dist_folder, export_environment, logging::initialize_logger}; use anyhow::Result; use clap::Parser; use embuild::espidf::{parse_esp_idf_git_ref, EspIdfRemote}; +use espup::{ + emoji, + logging::initialize_logger, + targets::{parse_targets, Target}, + toolchain::{ + espidf::{ + get_dist_path, get_install_path, get_tool_path, EspIdfRepo, DEFAULT_GIT_REPOSITORY, + }, + gcc_toolchain::install_gcc_targets, + llvm_toolchain::LlvmToolchain, + rust_toolchain::{ + check_rust_installation, get_rustup_home, install_riscv_target, RustCrate, + RustToolchain, + }, + }, +}; use log::{debug, info}; -use std::{collections::HashSet, fs::remove_dir_all, path::PathBuf}; - -mod emoji; -mod espidf; -mod gcc_toolchain; -mod llvm_toolchain; -mod rust_toolchain; -mod targets; -mod utils; +use std::{ + collections::HashSet, + fs::{remove_dir_all, File}, + io::Write, + path::PathBuf, +}; #[cfg(windows)] const DEFAULT_EXPORT_FILE: &str = "export-esp.ps1"; @@ -230,7 +233,7 @@ fn uninstall(args: UninstallOpts) -> Result<()> { info!("{} Deleting ESP-IDF", emoji::WRENCH); let repo = EspIdfRemote { git_ref: parse_esp_idf_git_ref(espidf_version), - repo_url: Some(espidf::DEFAULT_GIT_REPOSITORY.to_string()), + repo_url: Some(DEFAULT_GIT_REPOSITORY.to_string()), }; remove_dir_all(get_install_path(repo).parent().unwrap())?; } @@ -268,3 +271,55 @@ fn main() -> Result<()> { SubCommand::Uninstall(args) => uninstall(args), } } + +/// Deletes dist folder. +fn clear_dist_folder() -> Result<()> { + info!("{} Clearing dist folder", emoji::WRENCH); + remove_dir_all(&get_dist_path(""))?; + Ok(()) +} + +/// Creates the export file with the necessary environment variables. +pub fn export_environment(export_file: &PathBuf, exports: &[String]) -> Result<()> { + info!("{} Creating export file", emoji::WRENCH); + let mut file = File::create(export_file)?; + for e in exports.iter() { + file.write_all(e.as_bytes())?; + file.write_all(b"\n")?; + } + #[cfg(windows)] + info!( + "{} PLEASE set up the environment variables running: '.\\{}'", + emoji::INFO, + export_file.display() + ); + #[cfg(unix)] + info!( + "{} PLEASE set up the environment variables running: '. {}'", + emoji::INFO, + export_file.display() + ); + info!( + "{} This step must be done every time you open a new terminal.", + emoji::WARN + ); + Ok(()) +} + +#[cfg(windows)] +/// For Windows, we need to check that we are installing all the targets if we are installing esp-idf. +pub fn check_arguments(targets: &HashSet, espidf_version: &Option) -> Result<()> { + if espidf_version.is_some() + && (!targets.contains(&Target::ESP32) + || !targets.contains(&Target::ESP32C3) + || !targets.contains(&Target::ESP32S2) + || !targets.contains(&Target::ESP32S3)) + { + bail!( + "{} When installing esp-idf in Windows, only --targets \"all\" is supported.", + emoji::ERROR + ); + } + + Ok(()) +} diff --git a/src/targets.rs b/src/targets.rs index 2c3abfb..fcf2d05 100644 --- a/src/targets.rs +++ b/src/targets.rs @@ -2,10 +2,10 @@ use crate::emoji; use log::debug; -use std::collections::HashSet; -use strum::{Display, EnumString}; +use std::{collections::HashSet, str::FromStr}; +use strum::Display; -#[derive(Clone, Copy, Hash, PartialEq, Eq, Debug, Display, EnumString)] +#[derive(Clone, Copy, Hash, PartialEq, Eq, Debug, Display)] pub enum Target { /// Xtensa LX7 based dual core @@ -22,14 +22,16 @@ pub enum Target { ESP32C3, } -impl Target { - pub fn from_str(s: &str) -> Option { +impl FromStr for Target { + type Err = (); + + fn from_str(s: &str) -> Result { match s { - "esp32" => Some(Target::ESP32), - "esp32s2" => Some(Target::ESP32S2), - "esp32s3" => Some(Target::ESP32S3), - "esp32c3" => Some(Target::ESP32C3), - _ => None, + "esp32" => Ok(Target::ESP32), + "esp32s2" => Ok(Target::ESP32S2), + "esp32s3" => Ok(Target::ESP32S3), + "esp32c3" => Ok(Target::ESP32C3), + _ => Err(()), } } } @@ -52,7 +54,7 @@ pub fn parse_targets(targets_str: &str) -> Result, String> { }; for target in targets_str { - targets.insert(Target::from_str(target).unwrap()); + targets.insert(FromStr::from_str(target).unwrap()); } debug!("{} Parsed targets: {:?}", emoji::DEBUG, targets); Ok(targets) @@ -60,8 +62,8 @@ pub fn parse_targets(targets_str: &str) -> Result, String> { #[cfg(test)] mod tests { - use crate::parse_targets; - use crate::Target; + use espup::parse_targets; + use espup::Target; #[test] fn test_parse_targets() { assert_eq!( diff --git a/src/espidf.rs b/src/toolchain/espidf.rs similarity index 97% rename from src/espidf.rs rename to src/toolchain/espidf.rs index 4b82cce..78b55b3 100644 --- a/src/espidf.rs +++ b/src/toolchain/espidf.rs @@ -1,9 +1,13 @@ //! GCC Toolchain source and installation tools -use crate::emoji; -use crate::gcc_toolchain::{get_toolchain_name, get_ulp_toolchain_name}; -use crate::targets::Target; -use crate::utils::get_home_dir; +use crate::{ + emoji, + targets::Target, + toolchain::{ + gcc_toolchain::{get_toolchain_name, get_ulp_toolchain_name}, + get_home_dir, + }, +}; use anyhow::{Context, Result}; use embuild::{espidf, espidf::EspIdfRemote, git}; use log::{debug, info}; diff --git a/src/gcc_toolchain.rs b/src/toolchain/gcc_toolchain.rs similarity index 97% rename from src/gcc_toolchain.rs rename to src/toolchain/gcc_toolchain.rs index f8d3ba4..a1e1ef6 100644 --- a/src/gcc_toolchain.rs +++ b/src/toolchain/gcc_toolchain.rs @@ -1,9 +1,10 @@ //! GCC Toolchain source and installation tools -use crate::emoji; -use crate::espidf::get_tool_path; -use crate::targets::Target; -use crate::utils::download_file; +use crate::{ + emoji, + targets::Target, + toolchain::{download_file, espidf::get_tool_path}, +}; use anyhow::Result; use embuild::espidf::EspIdfVersion; use log::{debug, info}; diff --git a/src/llvm_toolchain.rs b/src/toolchain/llvm_toolchain.rs similarity index 97% rename from src/llvm_toolchain.rs rename to src/toolchain/llvm_toolchain.rs index 950c692..fccde4f 100644 --- a/src/llvm_toolchain.rs +++ b/src/toolchain/llvm_toolchain.rs @@ -1,8 +1,9 @@ //! LLVM Toolchain source and installation tools -use crate::emoji; -use crate::espidf::get_tool_path; -use crate::utils::download_file; +use crate::{ + emoji, + toolchain::{download_file, espidf::get_tool_path}, +}; use anyhow::{bail, Ok, Result}; use log::info; use std::path::{Path, PathBuf}; @@ -146,7 +147,7 @@ fn get_release_with_underscores(version: &str) -> String { #[cfg(test)] mod tests { - use crate::llvm_toolchain::get_release_with_underscores; + use espup::llvm_toolchain::get_release_with_underscores; #[test] fn test_get_release_with_underscores() { diff --git a/src/utils.rs b/src/toolchain/mod.rs similarity index 58% rename from src/utils.rs rename to src/toolchain/mod.rs index b9b2398..e4b2f85 100644 --- a/src/utils.rs +++ b/src/toolchain/mod.rs @@ -1,5 +1,4 @@ use crate::emoji; -use crate::espidf::get_dist_path; #[cfg(windows)] use crate::targets::Target; use anyhow::{bail, Result}; @@ -9,32 +8,17 @@ use log::info; #[cfg(windows)] use std::collections::HashSet; use std::{ - fs::{create_dir_all, remove_dir_all, File}, - io::{copy, BufReader, Write}, - path::{Path, PathBuf}, + fs::{create_dir_all, File}, + io::{copy, BufReader}, + path::Path, }; use tar::Archive; use xz2::read::XzDecoder; -pub mod logging { - use env_logger::{Builder, Env, WriteStyle}; - - /// Initializes the logger - pub fn initialize_logger(log_level: &str) { - Builder::from_env(Env::default().default_filter_or(log_level)) - .format_target(false) - .format_timestamp_secs() - .write_style(WriteStyle::Always) - .init(); - } -} - -/// Deletes dist folder. -pub fn clear_dist_folder() -> Result<()> { - info!("{} Clearing dist folder", emoji::WRENCH); - remove_dir_all(&get_dist_path(""))?; - Ok(()) -} +pub mod espidf; +pub mod gcc_toolchain; +pub mod llvm_toolchain; +pub mod rust_toolchain; /// Returns the path to the home directory. pub fn get_home_dir() -> String { @@ -112,48 +96,3 @@ pub fn download_file( } Ok(format!("{}/{}", output_directory, file_name)) } - -/// Creates the export file with the necessary environment variables. -pub fn export_environment(export_file: &PathBuf, exports: &[String]) -> Result<()> { - info!("{} Creating export file", emoji::WRENCH); - let mut file = File::create(export_file)?; - for e in exports.iter() { - file.write_all(e.as_bytes())?; - file.write_all(b"\n")?; - } - #[cfg(windows)] - info!( - "{} PLEASE set up the environment variables running: '.\\{}'", - emoji::INFO, - export_file.display() - ); - #[cfg(unix)] - info!( - "{} PLEASE set up the environment variables running: '. {}'", - emoji::INFO, - export_file.display() - ); - info!( - "{} This step must be done every time you open a new terminal.", - emoji::WARN - ); - Ok(()) -} - -#[cfg(windows)] -/// For Windows, we need to check that we are installing all the targets if we are installing esp-idf. -pub fn check_arguments(targets: &HashSet, espidf_version: &Option) -> Result<()> { - if espidf_version.is_some() - && (!targets.contains(&Target::ESP32) - || !targets.contains(&Target::ESP32C3) - || !targets.contains(&Target::ESP32S2) - || !targets.contains(&Target::ESP32S3)) - { - bail!( - "{} When installing esp-idf in Windows, only --targets \"all\" is supported.", - emoji::ERROR - ); - } - - Ok(()) -} diff --git a/src/rust_toolchain.rs b/src/toolchain/rust_toolchain.rs similarity index 99% rename from src/rust_toolchain.rs rename to src/toolchain/rust_toolchain.rs index 20fff81..27c3507 100644 --- a/src/rust_toolchain.rs +++ b/src/toolchain/rust_toolchain.rs @@ -1,8 +1,9 @@ //! Xtensa Rust Toolchain source and installation tools -use crate::emoji; -use crate::espidf::get_dist_path; -use crate::utils::{download_file, get_home_dir}; +use crate::{ + emoji, + toolchain::{download_file, espidf::get_dist_path, get_home_dir}, +}; use anyhow::{bail, Result}; use embuild::cmd; use log::{info, warn};