latest pushes

This commit is contained in:
2024-10-11 16:37:43 -04:00
parent 62363b8b23
commit e8a2ba1856
3 changed files with 68 additions and 36 deletions

View File

@@ -20,17 +20,17 @@ glob = "0.3.1"
tempfile = "3.3.0" tempfile = "3.3.0"
shellexpand = "3.1.0" shellexpand = "3.1.0"
meval = "0.2.0" meval = "0.2.0"
reqwest = { version = "0.11", features = ["json", "blocking"] } reqwest = "0.11"
serde = { version = "1.0", features = ["derive"] } serde = "1.0"
serde_json = "1.0" serde_json = "1.0"
thiserror = "1.0" thiserror = "1.0"
anyhow = "1.0" anyhow = "1.0"
clap = { version = "4.0", features = ["derive"] } clap = "4.0"
regex = "1.7" regex = "1.7"
lazy_static = "1.4" lazy_static = "1.4"
log = "0.4" log = "0.4"
env_logger = "0.10" env_logger = "0.10"
tokio = { version = "1.0", features = ["full"] } tokio = "1.0"
async-trait = "0.1" async-trait = "0.1"
futures = "0.3" futures = "0.3"
chrono = "0.4" chrono = "0.4"

View File

@@ -13,7 +13,6 @@
``` ```
Name: bellronos Name: bellronos
Version: 0.0.1
Summary: Bellande Operating System Scripting Language Summary: Bellande Operating System Scripting Language
Home-page: github.com/Architecture-Mechanism/bellronos Home-page: github.com/Architecture-Mechanism/bellronos
Author: Ronaldson Bellande Author: Ronaldson Bellande

View File

@@ -15,16 +15,16 @@
use crate::error::error::BellronosError; use crate::error::error::BellronosError;
use reqwest; use reqwest;
use serde::{Deserialize, Serialize}; use serde_json;
use std::fs::{self, File}; use std::fs::{self, File};
use std::io::{Error as IoError, Write}; use std::io::{Error as IoError, Write};
use std::path::PathBuf; use std::path::PathBuf;
use tokio::runtime::Handle;
const PACKAGE_REGISTRY_URL: &str = const PACKAGE_REGISTRY_URL: &str =
"https://bellande-architecture-mechanism-research-innovation-center.org/bellronos/packages"; "https://bellande-architecture-mechanism-research-innovation-center.org/bellronos/packages";
const GITHUB_REPO_URL: &str = "https://github.com/Architecture-Mechanism/bellronos_package_manager"; const GITHUB_REPO_URL: &str = "https://github.com/Architecture-Mechanism/bellronos_package_manager";
#[derive(Serialize, Deserialize)]
struct PackageMetadata { struct PackageMetadata {
name: String, name: String,
version: String, version: String,
@@ -33,30 +33,27 @@ struct PackageMetadata {
pub struct PackageManager { pub struct PackageManager {
package_dir: PathBuf, package_dir: PathBuf,
handle: Handle,
} }
impl PackageManager { impl PackageManager {
pub fn new(package_dir: String) -> Self { pub fn new(package_dir: String) -> Self {
PackageManager { PackageManager {
package_dir: PathBuf::from(package_dir), package_dir: PathBuf::from(package_dir),
handle: Handle::current(),
} }
} }
pub fn install_package(&self, package_name: &str) -> Result<(), BellronosError> { pub fn install_package(&self, package_name: &str) -> Result<(), BellronosError> {
println!("Installing package: {}", package_name); println!("Installing package: {}", package_name);
// Fetch package metadata
let metadata = self.fetch_package_metadata(package_name)?; let metadata = self.fetch_package_metadata(package_name)?;
// Download package
let package_content = self.download_package(&metadata)?; let package_content = self.download_package(&metadata)?;
// Install dependencies
for dependency in &metadata.dependencies { for dependency in &metadata.dependencies {
self.install_package(dependency)?; self.install_package(dependency)?;
} }
// Write package content
let package_path = self let package_path = self
.package_dir .package_dir
.join(&metadata.name) .join(&metadata.name)
@@ -130,8 +127,10 @@ impl PackageManager {
package_name: &str, package_name: &str,
) -> Result<PackageMetadata, BellronosError> { ) -> Result<PackageMetadata, BellronosError> {
let url = format!("{}/{}/metadata.json", PACKAGE_REGISTRY_URL, package_name); let url = format!("{}/{}/metadata.json", PACKAGE_REGISTRY_URL, package_name);
let response = reqwest::blocking::get(&url).map_err(|e| { let response = self.handle.block_on(async {
BellronosError::Network(format!("Failed to fetch package metadata: {}", e)) reqwest::get(&url).await.map_err(|e| {
BellronosError::Network(format!("Failed to fetch package metadata: {}", e))
})
})?; })?;
if !response.status().is_success() { if !response.status().is_success() {
@@ -141,9 +140,28 @@ impl PackageManager {
))); )));
} }
response let text = self.handle.block_on(async {
.json::<PackageMetadata>() response.text().await.map_err(|e| {
.map_err(|e| BellronosError::Parser(format!("Failed to parse package metadata: {}", e))) BellronosError::Network(format!("Failed to read package metadata: {}", e))
})
})?;
let json: serde_json::Value = serde_json::from_str(&text).map_err(|e| {
BellronosError::Parser(format!("Failed to parse package metadata: {}", e))
})?;
Ok(PackageMetadata {
name: json["name"].as_str().unwrap_or("").to_string(),
version: json["version"].as_str().unwrap_or("").to_string(),
dependencies: json["dependencies"]
.as_array()
.map(|arr| {
arr.iter()
.filter_map(|v| v.as_str().map(|s| s.to_string()))
.collect()
})
.unwrap_or_default(),
})
} }
fn download_package(&self, metadata: &PackageMetadata) -> Result<String, BellronosError> { fn download_package(&self, metadata: &PackageMetadata) -> Result<String, BellronosError> {
@@ -151,8 +169,11 @@ impl PackageManager {
"{}/{}/{}.bellronos", "{}/{}/{}.bellronos",
PACKAGE_REGISTRY_URL, metadata.name, metadata.version PACKAGE_REGISTRY_URL, metadata.name, metadata.version
); );
let response = reqwest::blocking::get(&url) let response = self.handle.block_on(async {
.map_err(|e| BellronosError::Network(format!("Failed to download package: {}", e)))?; reqwest::get(&url)
.await
.map_err(|e| BellronosError::Network(format!("Failed to download package: {}", e)))
})?;
if !response.status().is_success() { if !response.status().is_success() {
return Err(BellronosError::Network(format!( return Err(BellronosError::Network(format!(
@@ -161,9 +182,11 @@ impl PackageManager {
))); )));
} }
response self.handle.block_on(async {
.text() response.text().await.map_err(|e| {
.map_err(|e| BellronosError::Network(format!("Failed to read package content: {}", e))) BellronosError::Network(format!("Failed to read package content: {}", e))
})
})
} }
pub fn update_package(&self, package_name: &str) -> Result<(), BellronosError> { pub fn update_package(&self, package_name: &str) -> Result<(), BellronosError> {
@@ -175,17 +198,14 @@ impl PackageManager {
))); )));
} }
// Fetch latest metadata
let metadata = self.fetch_package_metadata(package_name)?; let metadata = self.fetch_package_metadata(package_name)?;
// Check if update is needed
let current_version = self.get_installed_package_version(package_name)?; let current_version = self.get_installed_package_version(package_name)?;
if current_version == metadata.version { if current_version == metadata.version {
println!("Package {} is already up to date", package_name); println!("Package {} is already up to date", package_name);
return Ok(()); return Ok(());
} }
// Perform update
self.install_package(package_name) self.install_package(package_name)
} }
@@ -205,7 +225,6 @@ impl PackageManager {
)) ))
})?; })?;
// Extract version from package content
content content
.lines() .lines()
.find(|line| line.starts_with("# Version:")) .find(|line| line.starts_with("# Version:"))
@@ -216,8 +235,11 @@ impl PackageManager {
pub fn search_packages(&self, query: &str) -> Result<Vec<String>, BellronosError> { pub fn search_packages(&self, query: &str) -> Result<Vec<String>, BellronosError> {
let url = format!("{}/search?q={}", PACKAGE_REGISTRY_URL, query); let url = format!("{}/search?q={}", PACKAGE_REGISTRY_URL, query);
let response = reqwest::blocking::get(&url) let response = self.handle.block_on(async {
.map_err(|e| BellronosError::Network(format!("Failed to search packages: {}", e)))?; reqwest::get(&url)
.await
.map_err(|e| BellronosError::Network(format!("Failed to search packages: {}", e)))
})?;
if !response.status().is_success() { if !response.status().is_success() {
return Err(BellronosError::Network(format!( return Err(BellronosError::Network(format!(
@@ -226,15 +248,23 @@ impl PackageManager {
))); )));
} }
response let text = self.handle.block_on(async {
.json::<Vec<String>>() response.text().await.map_err(|e| {
BellronosError::Network(format!("Failed to read search results: {}", e))
})
})?;
serde_json::from_str(&text)
.map_err(|e| BellronosError::Parser(format!("Failed to parse search results: {}", e))) .map_err(|e| BellronosError::Parser(format!("Failed to parse search results: {}", e)))
} }
pub fn get_package_info(&self, package_name: &str) -> Result<String, BellronosError> { pub fn get_package_info(&self, package_name: &str) -> Result<String, BellronosError> {
let url = format!("{}/{}/README.md", GITHUB_REPO_URL, package_name); let url = format!("{}/{}/README.md", GITHUB_REPO_URL, package_name);
let response = reqwest::blocking::get(&url) let response = self.handle.block_on(async {
.map_err(|e| BellronosError::Network(format!("Failed to fetch package info: {}", e)))?; reqwest::get(&url).await.map_err(|e| {
BellronosError::Network(format!("Failed to fetch package info: {}", e))
})
})?;
if !response.status().is_success() { if !response.status().is_success() {
return Err(BellronosError::Network(format!( return Err(BellronosError::Network(format!(
@@ -243,8 +273,11 @@ impl PackageManager {
))); )));
} }
response self.handle.block_on(async {
.text() response
.map_err(|e| BellronosError::Network(format!("Failed to read package info: {}", e))) .text()
.await
.map_err(|e| BellronosError::Network(format!("Failed to read package info: {}", e)))
})
} }
} }