10 Commits
Author SHA1 Message Date
phoenix a8ed05c278 tsk-100: Name change (#101)
Rust / build (push) Successful in 1m44s
Rust / build (pull_request) Successful in 3m10s
From `icarus_dm` -> `idm`.

Closes #100

Reviewed-on: phoenix/icarus_dm#101
2026-07-10 19:03:11 -04:00
phoenix 489d13227b Update rust (#99)
Rust / build (pull_request) Failing after 4s
* bump: rust

* bump: rust ci

* Updated License

* bump: reqwest

* bump: tokio

* bump: uuid

* bump: icarus_models

* cargo update

* bump: icarus_dm
2026-05-05 21:05:40 -04:00
phoenix 0e6438cf0d Updated rust (#95)
* Updated rust version in workflow

* Using variable in workflow file

* Updating packages

* cargo update

* Version bump
2026-04-05 17:14:50 -04:00
KD 00615532ce icarus_models version bump (#93)
* icarus_models version bump

* Build fix

* Removed method

* Some refactoring

* More cleanup

* Version bump

* Using standard version
2025-10-30 15:33:09 -04:00
KD abd16eeba2 tsk-79: Simplifying functions (#92)
* tsk-79: Changed return type of function and cleaned up other functions

* tsk-79: Version bump

* tsk-79: Code formatting
2025-10-27 12:42:42 -04:00
KD 5c9fcf2ec5 tsk-83: Add token code prior to action execution (#91)
* tsk-83: Code cleanup

* tsk-83: Added code to get token before an action begins

* tsk-83: Small fix

* tsk-83: Version bump

* tsk-83: Cleanup
2025-10-26 16:39:16 -04:00
KD 6bedab0d88 tsk-82: Refactor validate_args() method (#90)
* tsk-82: Refactored validate_flags() method

* tsk-82: Warning fix

* tsk-82: Code formatting

* tsk-82: Version bump

* tsk-82: Forgot this

* tsk-82: Fix
2025-10-24 20:51:33 -04:00
KD 686e0d8f1f tsk-81: Simplify downloading song (#89)
* tsk-81: Using method in Song to save to filesystem

* tsk-81: icaurs_models version bump

* tsk-81: Code formatting

* tsk-81: icarus_models version bump

* tsk-81: Version bump
2025-10-24 13:34:55 -04:00
KD 05a9134aaa tsk-80: Removing unused serde references (#88)
* tsk-80: Removing unused serde references

* tsk-80: Version bump

* tsk-80: Formatting code
2025-10-23 21:10:08 -04:00
KD 3cadac4efd tsk-78: Updating returned error on converting ostring to string (#87)
* tsk-78: Making error to get string from o string more robust

* tsk-78: Version bump
2025-10-23 16:52:26 -04:00
16 changed files with 1001 additions and 645 deletions
+6 -8
View File
@@ -15,19 +15,17 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- name: Install Rust version
run: rustup install 1.90.0 && rustup default 1.90.0
- name: Debug secret
run: echo "${{ secrets.MYREPO_TOKEN }}" | head -c 10 ; echo "..."
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- name: Build
run: |
mkdir -p ~/.ssh
echo "$EXTREPO_KEY" > ~/.ssh/gitlab_deploy_key
chmod 600 ~/.ssh/gitlab_deploy_key
ssh-keyscan git.kundeng.us ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLl/OZiKVDxwnyvMxa+rjKvDpKqTxH1GWuGuDPLmENGQMbTVulajZWr9x8Q1cotoJiHZkt7DA5vczcjB/4lwgWA= >> ~/.ssh/known_hosts
ssh-keyscan ${{ secrets.MYHOST }}= >> ~/.ssh/known_hosts
eval $(ssh-agent -s)
ssh-add -v ~/.ssh/gitlab_deploy_key
Generated
+847 -413
View File
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -1,17 +1,17 @@
[package]
name = "icarus-dm"
version = "0.8.4"
rust-version = "1.90"
name = "idm"
version = "0.10.0"
rust-version = "1.95"
edition = "2024"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
futures = { version = "0.3.31" }
http = { version = "1.3.1" }
reqwest = { version = "0.12.23", features = ["json", "blocking", "multipart", "stream"] }
futures = { version = "0.3.32" }
http = { version = "1.4.0" }
reqwest = { version = "0.13.3", features = ["json", "blocking", "multipart", "stream"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
tokio = { version = "1.47.1", features = ["full"] }
tokio-util = { version = "0.7.16", features = ["codec"] }
uuid = { version = "1.18.1", features = ["v4", "serde"] }
icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.8.0" }
serde_json = "1.0.149"
tokio = { version = "1.52", features = ["full"] }
tokio-util = { version = "0.7.18", features = ["codec"] }
uuid = { version = "1.23.1", features = ["v4", "serde"] }
icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.11.1" }
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2025 Kun Deng
Copyright (c) 2026 Kun Deng
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+9 -27
View File
@@ -1,72 +1,54 @@
# IcarusDownloadManager
# idm
IcarusDownloadManager is a CLI software client application that has the feature of uploading and downloading songs from the [Icarus](https://github.com/kdeng00/Icarus) Music Server.
idm (IcarusDownloadManager) is a CLI software client application that has the feature of uploading and downloading songs from the [icarus](https://git.kundeng.us/phoenix/icarus) Music Server.
## Built With
* Rust
* Cargo
* futures
* http
* reqwst
* serde
* serde_json
* tokio
* tokio-util
* icarus_models
### Getting Started
Clone the repo
```BASH
git clone git@github.com:kdeng00/IcarusDownloadManager.git
git clone git@git.kundeng.us:phoenix/idm.git
```
Build the project:
```BASH
cd IcarusDownloadManager
cd idm
cargo build
```
Even though this project is open source, there are some libraries that are closed source (may be opened later).
In order to successfully build it, your ssh public key would be needed to add to the closed libraries. If you
have interest, something could be worked out to provide access.
The program has been built and can be executed by the binary file *icarus-dm*. For information on how to use icarua-dm, merely execute the program without any command line arguments.
### Downloading Song
```BASH
icarus-dm download -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -b e8407fc6-edd2-44c1-993f-08dd7324d91a
idm download -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -b e8407fc6-edd2-44c1-993f-08dd7324d91a
```
### Uploading Song with metadata
```BASH
icarus-dm upload-meta -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -s /path/of/song.flac -t 1 -m /path/to/metadata/config/collection.json -ca /path/to/cover/art/image.png
idm upload-meta -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -s /path/of/song.flac -t 1 -m /path/to/metadata/config/collection.json -ca /path/to/cover/art/image.png
```
### Uploading Song with metadata from directory
```BASH
icarus-dm upload-meta -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -smca /path/where/songs/and/metadata/exists/
idm upload-meta -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -smca /path/where/songs/and/metadata/exists/
```
### Retrieving Song in json
```Bash
icarus-dm retrieve -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -rt songs
idm retrieve -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -rt songs
```
### Deleting Song
```BASH
icarus-dm delete -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -D e8407fc6-edd2-44c1-993f-08dd7324d91a
idm delete -u spacecadet -p stellar40 -h https://icarus.com -ha https://auth.icarus.com -D e8407fc6-edd2-44c1-993f-08dd7324d91a
```
+2 -1
View File
@@ -33,6 +33,7 @@ async fn main() {
let mut cmt_mgr = managers::commit_manager::CommitManager {
ica_action: chosen_act,
..Default::default()
};
cmt_mgr.commit_action().await;
@@ -91,7 +92,7 @@ mod tests {
#[test]
fn test_minimum_action_and_args() {
let args: Vec<String> = vec![
"icarus-dm".to_string(),
"idm".to_string(),
"download".to_string(),
"-u".to_string(),
"jamborie".to_string(),
+5 -7
View File
@@ -1,8 +1,6 @@
use serde::{Deserialize, Serialize};
use crate::{models, utilities};
#[derive(Debug, Deserialize, Serialize)]
#[derive(Debug)]
pub struct ActionManager {
pub action: String,
pub flags: Vec<models::flags::Flags>,
@@ -70,17 +68,17 @@ impl ActionManager {
while i < flag_vals.len() {
let flag = &flag_vals[i];
let mut flg = models::flags::Flags::default();
// TODO: Refactor this
if self.is_valid_flag(flag) && self.does_flag_have_value(flag) {
if self.is_valid_flag(flag) {
if self.does_flag_have_value(flag) {
flg.flag = String::from(flag);
flg.value = String::from(&flag_vals[i + 1]);
i += 1;
} else if self.is_valid_flag(flag) {
} else {
flg.flag = String::from(flag);
}
} else {
utilities::checks::exit_program(-1);
}
+90 -134
View File
@@ -1,20 +1,20 @@
use std::collections::HashMap;
use std::default::Default;
use std::fs::read_dir;
use std::io::{Result, Write};
use std::io::Result;
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use crate::managers;
use crate::models::{self};
use crate::parsers;
use crate::syncers;
use crate::utilities;
#[derive(Debug, Deserialize, Serialize)]
#[derive(Debug, Default)]
pub struct CommitManager {
pub ica_action: models::icarus_action::IcarusAction,
pub api: models::api::Api,
pub auth_api: models::api::Api,
}
#[derive(Clone, Debug)]
@@ -86,27 +86,36 @@ pub fn retrieve_song(
impl CommitManager {
pub async fn commit_action(&mut self) {
self.init_api().await;
let action = &self.ica_action.action;
println!("Committing {action} action");
let mapped_actions = &self.map_actions();
let mapped_action = self.find_mapped_action(mapped_actions, action);
let token = self.parse_token(&self.auth_api).await;
println!("{mapped_action:?}");
// TODO: Move code to get token here and then pass it to the respective functions
match mapped_action {
ActionValues::DeleteAct => self.delete_song().await,
ActionValues::DownloadAct => self.download_song().await,
ActionValues::RetrieveAct => self.retrieve_object().await,
ActionValues::UploadSongWithMetadata => self.upload_song_with_metadata().await,
match self.find_mapped_action(mapped_actions, action) {
ActionValues::DeleteAct => self.delete_song(&token).await,
ActionValues::DownloadAct => self.download_song(&token).await,
ActionValues::RetrieveAct => self.retrieve_object(&token).await,
ActionValues::UploadSongWithMetadata => self.upload_song_with_metadata(&token).await,
_ => {
println!("Nothing good here");
}
}
}
async fn init_api(&mut self) {
let mut prsr = parsers::api_parser::APIParser {
apis: vec![models::api::Api::default(), models::api::Api::default()],
ica_act: self.ica_action.clone(),
};
prsr.parse_api(parsers::api_parser::APIType::Main);
prsr.parse_api(parsers::api_parser::APIType::Auth);
self.api = prsr.retrieve_api(parsers::api_parser::APIType::Main);
self.auth_api = prsr.retrieve_api(parsers::api_parser::APIType::Auth);
}
fn find_mapped_action(
&self,
actions: &HashMap<String, ActionValues>,
@@ -122,7 +131,7 @@ impl CommitManager {
}
fn map_actions(&self) -> HashMap<String, ActionValues> {
let actions: HashMap<String, ActionValues> = HashMap::from([
HashMap::from([
("download".to_string(), ActionValues::DownloadAct),
("download".to_string(), ActionValues::DownloadAct),
(
@@ -131,24 +140,15 @@ impl CommitManager {
),
("retrieve".to_string(), ActionValues::RetrieveAct),
("delete".to_string(), ActionValues::DeleteAct),
]);
actions
])
}
async fn delete_song(&self) {
let mut prsr = parsers::api_parser::APIParser {
apis: vec![models::api::Api::default(), models::api::Api::default()],
ica_act: self.ica_action.clone(),
};
prsr.parse_api(parsers::api_parser::APIType::Main);
prsr.parse_api(parsers::api_parser::APIType::Auth);
let auth_api = prsr.retrieve_api(parsers::api_parser::APIType::Auth);
let token = self.parse_token(&auth_api).await;
async fn delete_song(&self, token: &icarus_models::token::AccessToken) {
println!("Deleting song");
let mut del = syncers::delete::Delete {
api: self.api.clone(),
};
let mut song = icarus_models::song::Song::default();
for arg in &self.ica_action.flags {
@@ -160,12 +160,7 @@ impl CommitManager {
}
}
let api = prsr.retrieve_api(parsers::api_parser::APIType::Main);
let mut del = syncers::delete::Delete { api: api.clone() };
println!("Deleting song..");
match del.delete_song(&token, &song).await {
match del.delete_song(token, &song).await {
Ok((song, _coverart)) => {
println!("Song (Id {:?}) has been successfully deleted", song.id);
}
@@ -175,39 +170,42 @@ impl CommitManager {
}
}
async fn download_song(&self) {
println!("Deleting song");
async fn download_song(&self, token: &icarus_models::token::AccessToken) {
println!("Downloading song");
let dwn = self.ica_action.retrieve_flag_value(&String::from("-b"));
let song_id = uuid::Uuid::from_str(dwn.as_str()).unwrap();
let mut prsr = parsers::api_parser::APIParser {
apis: vec![models::api::Api::default(), models::api::Api::default()],
ica_act: self.ica_action.clone(),
let mut dwn_loader = syncers::download::Download {
api: self.api.clone(),
};
prsr.parse_api(parsers::api_parser::APIType::Main);
prsr.parse_api(parsers::api_parser::APIType::Auth);
let auth_api = prsr.retrieve_api(parsers::api_parser::APIType::Auth);
let token = self.parse_token(&auth_api).await;
println!("Message: {}", token.message);
let api = prsr.retrieve_api(parsers::api_parser::APIType::Main);
let mut dwn_loader = syncers::download::Download { api: api.clone() };
let song = icarus_models::song::Song {
id: song_id,
let mut song = icarus_models::song::Song {
id: uuid::Uuid::from_str(dwn.as_str()).unwrap(),
..Default::default()
};
match dwn_loader.download_song(&token, &song).await {
match dwn_loader.download_song(token, &song).await {
Ok(o) => {
println!("Success");
let filename = String::from("audio")
+ icarus_models::constants::file_extensions::audio::DEFAULTMUSICEXTENSION;
let data = o.as_bytes();
let mut file = std::fs::File::create(filename).expect("Failed to save");
file.write_all(data)
.expect("Failed to save downloaded song");
println!("Song downloaded");
song.data = o.as_bytes().to_vec();
song.directory = String::from(".");
song.filename = match icarus_models::song::generate_filename(
icarus_models::types::MusicType::FlacExtension,
true,
) {
Ok(filename) => filename,
Err(err) => {
eprintln!("Error generating song filename: {err:?}");
utilities::checks::exit_program(-3);
return;
}
};
match song.save_to_filesystem() {
Ok(_) => {
println!("Song saved");
}
Err(err) => {
eprintln!("Error saving song: {err:?}");
}
}
}
Err(er) => {
println!("Error {er:?}");
@@ -223,7 +221,7 @@ impl CommitManager {
}
}
async fn retrieve_object(&self) {
async fn retrieve_object(&self, token: &icarus_models::token::AccessToken) {
println!("Retrieving song");
let rt = self.ica_action.retrieve_flag_value(&String::from("-rt"));
@@ -231,22 +229,11 @@ impl CommitManager {
panic!("Unsupported -rt: {rt}");
}
let mut prsr = parsers::api_parser::APIParser {
apis: vec![models::api::Api::default(), models::api::Api::default()],
ica_act: self.ica_action.clone(),
let mut repo = syncers::retrieve_records::RetrieveRecords {
api: self.api.clone(),
};
prsr.parse_api(parsers::api_parser::APIType::Main);
prsr.parse_api(parsers::api_parser::APIType::Auth);
let auth_api = prsr.retrieve_api(parsers::api_parser::APIType::Auth);
let token = self.parse_token(&auth_api).await;
println!("Token {token:?}");
let api = prsr.retrieve_api(parsers::api_parser::APIType::Main);
let mut repo = syncers::retrieve_records::RetrieveRecords { api: api.clone() };
match repo.get_all_songs(&token).await {
match repo.get_all_songs(token).await {
Ok(o) => {
println!("Songs");
println!("=====");
@@ -285,7 +272,7 @@ impl CommitManager {
token.unwrap()
}
async fn upload_song_with_metadata(&mut self) {
async fn upload_song_with_metadata(&mut self, token: &icarus_models::token::AccessToken) {
println!("Uplodaring song with metadara");
let songpath = self.ica_action.retrieve_flag_value(&String::from("-s"));
@@ -313,12 +300,12 @@ impl CommitManager {
println!("cover art path: {coverpath}");
let _ = self
.sing_target_upload(&songpath, &track_id, &metadata_path, &coverpath)
.sing_target_upload(&songpath, &track_id, &metadata_path, &coverpath, token)
.await;
} else if multitarget {
let _ = self.multi_target_upload(&uni).await;
let _ = self.multi_target_upload(&uni, token).await;
} else {
println!("Single or Multi target has not been chosen");
eprintln!("Single or Multi target has not been chosen");
}
}
@@ -329,19 +316,8 @@ impl CommitManager {
track_id: &str,
meta_path: &String,
cover_path: &str,
token: &icarus_models::token::AccessToken,
) -> Result<()> {
let mut prsr = parsers::api_parser::APIParser {
apis: vec![models::api::Api::default(), models::api::Api::default()],
ica_act: self.ica_action.clone(),
};
prsr.parse_api(parsers::api_parser::APIType::Main);
prsr.parse_api(parsers::api_parser::APIType::Auth);
let auth_api = prsr.retrieve_api(parsers::api_parser::APIType::Auth);
let token = self.parse_token(&auth_api).await;
println!("Token: {:?}", token.token);
let song_file = std::path::Path::new(&songpath);
if !song_file.exists() {
@@ -374,14 +350,13 @@ impl CommitManager {
println!("Filename: {:?}", s.filename);
println!("Path: {:?}", s.song_path());
s.data = icarus_models::song::io::to_data(&s).unwrap();
cover_art.data =
icarus_models::coverart::io::to_data(&cover_art).unwrap();
let members = UploadSongMembers {
song: s,
coverart: cover_art,
token,
token: token.clone(),
album,
};
@@ -459,22 +434,15 @@ impl CommitManager {
println!("Queued coverart Id: {id:?}");
println!("Linked queued song to queued coverart");
println!("Queued status updated");
}
Err(err) => {
return Err(std::io::Error::other(err.to_string()));
}
},
Err(err) => {
return Err(std::io::Error::other(err.to_string()));
}
},
Err(err) => {
return Err(std::io::Error::other(err.to_string()));
}
}
Ok(())
}
Err(err) => Err(std::io::Error::other(err.to_string())),
},
Err(err) => Err(std::io::Error::other(err.to_string())),
},
Err(err) => Err(std::io::Error::other(err.to_string())),
}
}
fn get_songs(
&self,
@@ -516,20 +484,15 @@ impl CommitManager {
}
Ok(songs)
}
Err(_) => Ok(Vec::new()),
Err(_) => Err(std::io::Error::other("Songs not retrieved")),
}
}
async fn multi_target_upload(&mut self, sourcepath: &String) -> std::io::Result<()> {
let mut prsr = parsers::api_parser::APIParser {
apis: vec![models::api::Api::default(), models::api::Api::default()],
ica_act: self.ica_action.clone(),
};
prsr.parse_api(parsers::api_parser::APIType::Main);
prsr.parse_api(parsers::api_parser::APIType::Auth);
let auth_api = prsr.retrieve_api(parsers::api_parser::APIType::Auth);
let token = self.parse_token(&auth_api).await;
async fn multi_target_upload(
&mut self,
sourcepath: &String,
token: &icarus_models::token::AccessToken,
) -> std::io::Result<()> {
let directory_path = std::path::Path::new(&sourcepath);
if !directory_path.exists() {
@@ -566,7 +529,7 @@ impl CommitManager {
println!("Response: {o:?}");
}
Err(err) => {
println!("Error: {err:?}");
eprintln!("Error: {err:?}");
return Err(err);
}
}
@@ -575,12 +538,12 @@ impl CommitManager {
Ok(())
}
Err(err) => {
println!("Error: {err:?}");
eprintln!("Error: {err:?}");
Err(std::io::Error::other(err.to_string()))
}
},
Err(error) => {
println!("Error: {error:?}");
eprintln!("Error: {error:?}");
Err(std::io::Error::other(error.to_string()))
}
}
@@ -602,7 +565,9 @@ impl CommitManager {
}
}
Ok((String::new(), String::new()))
Err(std::io::Error::other(
"CoverArt directory and filename not found",
))
}
fn find_file_extension(&self, file_name: &std::ffi::OsString) -> En {
@@ -670,15 +635,6 @@ impl CommitManager {
}
}
Ok(String::new())
}
fn _check_for_no_confirm(&self) -> bool {
for flag in self.ica_action.flags.iter() {
if flag.flag == "-nc" {
return true;
}
}
false
Err(std::io::Error::other("Metadata path not found"))
}
}
+5 -12
View File
@@ -23,7 +23,6 @@ impl Default for TokenManager {
user: icarus_models::user::User::default(),
api: models::api::Api::default(),
};
token.init();
token
@@ -35,7 +34,6 @@ impl TokenManager {
println!("Sending request for a token");
let url = self.retrieve_url();
println!("URL: {url}");
let mut token = icarus_models::token::AccessToken {
@@ -62,19 +60,18 @@ impl TokenManager {
token.token_type = login_result.token_type.clone();
token.expiration = login_result.expiration;
token.message = response.message;
Ok(token)
}
Err(err) => Err(std::io::Error::other(err.to_string())),
}
Err(_) => println!("Hm, the response didn't match the shape we expected."),
};
}
reqwest::StatusCode::UNAUTHORIZED => {
println!("Need to grab a new token");
Err(std::io::Error::other("Need to grab a new token"))
}
other => {
panic!("Uh oh! Something unexpected happened: {other:?}");
}
}
Ok(token)
}
pub fn init(&mut self) {
@@ -84,10 +81,6 @@ impl TokenManager {
}
pub fn retrieve_url(&self) -> String {
let api = &self.api;
let mut url = String::from(&api.url);
url += &String::from(&api.endpoint);
url
format!("{}{}", self.api.url, self.api.endpoint)
}
}
+1 -3
View File
@@ -1,10 +1,8 @@
use std::default::Default;
use serde::{Deserialize, Serialize};
use crate::models::{self};
#[derive(Debug, Default, Deserialize, Serialize)]
#[derive(Debug, Default)]
pub struct UserManager {
pub user: icarus_models::user::User,
pub ica_action: models::icarus_action::IcarusAction,
+1 -3
View File
@@ -1,8 +1,6 @@
use std::default::Default;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[derive(Clone, Debug, Default)]
pub struct Api {
pub url: String,
pub endpoint: String,
+1 -3
View File
@@ -1,8 +1,6 @@
use std::default::Default;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[derive(Clone, Debug, Default)]
pub struct Flags {
pub flag: String,
pub value: String,
+1 -3
View File
@@ -1,10 +1,8 @@
use std::default::Default;
use serde::{Deserialize, Serialize};
use crate::models;
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[derive(Clone, Debug, Default)]
pub struct IcarusAction {
pub action: String,
pub flags: Vec<models::flags::Flags>,
+7 -11
View File
@@ -9,22 +9,18 @@ pub fn retrieve_url(api: &models::api::Api, with_id: bool, id: &uuid::Uuid) -> S
}
fn retrieve_url_reg(api: &models::api::Api) -> String {
let url = format!("{}api/{}/{}/", api.url, api.version, api.endpoint);
url
format!("{}api/{}/{}/", api.url, api.version, api.endpoint)
}
fn retrieve_url_with_id(api: &models::api::Api, id: &uuid::Uuid) -> String {
let url = format!("{}api/{}/{}/{}", api.url, api.version, api.endpoint, id);
url
format!("{}api/{}/{}/{}", api.url, api.version, api.endpoint, id)
}
pub async fn auth_header(
token: &icarus_models::token::AccessToken,
) -> (http::HeaderName, http::HeaderValue) {
let auth = reqwest::header::AUTHORIZATION;
let auth_value = http::HeaderValue::from_str(&token.bearer_token()).unwrap();
(auth, auth_value)
) -> Result<(http::HeaderName, http::HeaderValue), http::header::InvalidHeaderValue> {
match http::HeaderValue::from_str(&token.bearer_token()) {
Ok(auth_value) => Ok((reqwest::header::AUTHORIZATION, auth_value)),
Err(err) => Err(err),
}
}
+6 -6
View File
@@ -61,7 +61,7 @@ impl Upload {
println!("Url: {url:?}");
let mut headers = reqwest::header::HeaderMap::new();
let (auth, auth_val) = syncers::common::auth_header(token).await;
let (auth, auth_val) = syncers::common::auth_header(token).await.unwrap();
headers.insert(auth, auth_val);
headers.insert("Accept", HeaderValue::from_str("*/*").unwrap());
headers.insert("Connection", HeaderValue::from_str("keep-alive").unwrap());
@@ -99,7 +99,7 @@ impl Upload {
let url = format!("{}/{endpoint}", self.api.url);
let mut headers = reqwest::header::HeaderMap::new();
let (auth, auth_val) = syncers::common::auth_header(token).await;
let (auth, auth_val) = syncers::common::auth_header(token).await.unwrap();
headers.insert(auth, auth_val);
let payload = serde_json::json!({
@@ -132,7 +132,7 @@ impl Upload {
let url = format!("{}/{endpoint}", self.api.url);
let mut headers = reqwest::header::HeaderMap::new();
let (auth, auth_val) = syncers::common::auth_header(token).await;
let (auth, auth_val) = syncers::common::auth_header(token).await.unwrap();
headers.insert(auth, auth_val);
let payload = serde_json::json!({
@@ -200,7 +200,7 @@ impl Upload {
println!("Url: {url:?}");
let mut headers = reqwest::header::HeaderMap::new();
let (auth, auth_val) = syncers::common::auth_header(token).await;
let (auth, auth_val) = syncers::common::auth_header(token).await.unwrap();
headers.insert(auth, auth_val);
headers.insert("Accept", HeaderValue::from_str("*/*").unwrap());
headers.insert("Connection", HeaderValue::from_str("keep-alive").unwrap());
@@ -239,7 +239,7 @@ impl Upload {
let url = format!("{}/{endpoint}", self.api.url);
let mut headers = reqwest::header::HeaderMap::new();
let (auth, auth_val) = syncers::common::auth_header(token).await;
let (auth, auth_val) = syncers::common::auth_header(token).await.unwrap();
headers.insert(auth, auth_val);
let payload = serde_json::json!({
@@ -271,7 +271,7 @@ impl Upload {
let url = format!("{}/{endpoint}", self.api.url);
let mut headers = reqwest::header::HeaderMap::new();
let (auth, auth_val) = syncers::common::auth_header(token).await;
let (auth, auth_val) = syncers::common::auth_header(token).await.unwrap();
headers.insert(auth, auth_val);
let payload = serde_json::json!({
+7 -1
View File
@@ -1,6 +1,12 @@
pub fn o_to_string(val: &std::ffi::OsString) -> Result<std::string::String, std::io::Error> {
match val.clone().into_string() {
Ok(value) => Ok(value),
Err(_) => Err(std::io::Error::other(String::from("Error"))),
Err(err) => match err.into_string() {
Ok(res) => Err(std::io::Error::other(res.to_string())),
Err(err) => match err.to_str() {
Some(err) => Err(std::io::Error::other(err)),
None => Err(std::io::Error::other("Undefined error")),
},
},
}
}