diff --git a/.idea/dictionaries/drewshort.xml b/.idea/dictionaries/drewshort.xml
new file mode 100644
index 0000000..f97c0a0
--- /dev/null
+++ b/.idea/dictionaries/drewshort.xml
@@ -0,0 +1,8 @@
+
+
+
+ anime
+ animeboxes
+
+
+
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index 9ef8679..678a066 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -6,6 +6,7 @@ version = "0.1.0"
dependencies = [
"chrono",
"clap",
+ "lazy_static",
"serde",
"serde_json",
]
@@ -84,6 +85,12 @@ version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
[[package]]
name = "libc"
version = "0.2.70"
diff --git a/Cargo.toml b/Cargo.toml
index 128de4b..fe7ed0c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,5 +14,6 @@ incremental = false
[dependencies]
chrono = { version = "0.4.11", features = ["serde"] }
clap = "2.33.1"
+lazy_static = "1.4.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index b9c2c41..89f141a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,23 +1,51 @@
use clap::{App, Arg};
+use lazy_static::lazy_static;
use serde_json::from_reader;
use std::error::Error;
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
+use std::process::exit;
const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");
+lazy_static! {
+ static ref COMMANDS: Vec<&'static str> = vec!["print", "searches", "favorites"];
+}
mod model;
fn read_animeboxes_backup>(
path: P,
-) -> Result> {
+) -> Result> {
let file = File::open(path)?;
let reader = BufReader::new(file);
- let result: model::AnimeBoxesBackup = from_reader(reader)?;
+ let result: model::anime_boxes::Backup = from_reader(reader)?;
Ok(result)
}
+fn searches_command(backup: model::anime_boxes::Backup) {
+ let mut searches: Vec = backup
+ .search_history
+ .iter()
+ .map(|s| String::from(&s.search_text))
+ .collect();
+ searches.sort();
+ for search in searches {
+ println!("{}", search);
+ }
+}
+
+fn favorites_command(backup: model::anime_boxes::Backup) {
+ let mut favorites: Vec = backup
+ .favorites
+ .iter()
+ .map(|f| String::from(&f.file.url))
+ .collect();
+ for favorite in favorites {
+ println!("{}", favorite);
+ }
+}
+
fn main() {
let matches = App::new("AnimeBoxes Sync")
.version(VERSION.unwrap_or("UNKNOWN"))
@@ -36,12 +64,31 @@ fn main() {
.required(true)
.index(1),
)
+ .arg(
+ Arg::with_name("COMMAND")
+ .help("The command to run on the backup")
+ .required(true)
+ .index(2)
+ .possible_values(&COMMANDS),
+ )
.get_matches();
let config = matches.value_of("config").unwrap_or("abs-default.conf");
let path = matches.value_of("INPUT").unwrap();
+ let result = read_animeboxes_backup(path).unwrap();
- let result = read_animeboxes_backup(path);
-
- println!("{:#?}", result.unwrap())
+ let command = matches.value_of("COMMAND").unwrap();
+ match command {
+ "favorites" => {
+ favorites_command(result);
+ }
+ "print" => println!("{:#?}", result),
+ "searches" => {
+ searches_command(result);
+ }
+ _ => {
+ println!("{} is unrecognized", command);
+ exit(1)
+ }
+ }
}
diff --git a/src/model.rs b/src/model.rs
index 51f5c4b..415021e 100644
--- a/src/model.rs
+++ b/src/model.rs
@@ -1,117 +1,119 @@
-use chrono::DateTime;
-use serde::{Deserialize, Serialize};
+pub mod anime_boxes {
+ use chrono::DateTime;
+ use serde::{Deserialize, Serialize};
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(deny_unknown_fields)]
-pub struct AnimeBoxesBackup {
- #[serde(rename(serialize = "backupTime", deserialize = "backupTime"))]
- backup_time: DateTime,
- #[serde(rename(serialize = "backupVersion", deserialize = "backupVersion"))]
- backup_version: String,
- #[serde(rename(serialize = "bannedTags", deserialize = "bannedTags"))]
- banned_tags: Vec,
- #[serde(rename(serialize = "creatorName", deserialize = "creatorName"))]
- creator_name: String,
- #[serde(rename(serialize = "creatorVersion", deserialize = "creatorVersion"))]
- creator_version: String,
- favorites: Vec,
- #[serde(rename(serialize = "searchHistory", deserialize = "searchHistory"))]
- search_history: Vec,
- servers: Vec,
-}
+ #[derive(Serialize, Deserialize, Debug)]
+ #[serde(deny_unknown_fields)]
+ pub struct Backup {
+ #[serde(rename(serialize = "backupTime", deserialize = "backupTime"))]
+ pub backup_time: DateTime,
+ #[serde(rename(serialize = "backupVersion", deserialize = "backupVersion"))]
+ pub backup_version: String,
+ #[serde(rename(serialize = "bannedTags", deserialize = "bannedTags"))]
+ pub banned_tags: Vec,
+ #[serde(rename(serialize = "creatorName", deserialize = "creatorName"))]
+ pub creator_name: String,
+ #[serde(rename(serialize = "creatorVersion", deserialize = "creatorVersion"))]
+ pub creator_version: String,
+ pub favorites: Vec,
+ #[serde(rename(serialize = "searchHistory", deserialize = "searchHistory"))]
+ pub search_history: Vec,
+ pub servers: Vec,
+ }
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(deny_unknown_fields)]
-struct AnimeBoxesFavorite {
- #[serde(rename(serialize = "dateAdded", deserialize = "dateAdded"))]
- date_added: DateTime,
- #[serde(rename(serialize = "disableStorage", deserialize = "disableStorage"))]
- disable_storage: bool,
- #[serde(rename(
- serialize = "enforceOriginalImage",
- deserialize = "enforceOriginalImage"
- ))]
- enforce_original_image: bool,
- file: AnimeBoxesRemoteResource,
- has_children: bool,
- has_comments: bool,
- has_notes: bool,
- #[serde(rename(serialize = "imageIsVisible", deserialize = "imageIsVisible"))]
- image_is_visible: bool,
- #[serde(rename(serialize = "isFavorite", deserialize = "isFavorite"))]
- is_favorite: bool,
- #[serde(rename(serialize = "isVisible", deserialize = "isVisible"))]
- is_visible: bool,
- jpeg: AnimeBoxesRemoteResource,
- md5: String,
- parent_id: String,
- #[serde(rename(serialize = "ppostId", deserialize = "ppostId"))]
- ppost_id: String,
- #[serde(rename(serialize = "ppostUrl", deserialize = "ppostUrl"))]
- ppost_url: String,
- preview: AnimeBoxesRemoteResource,
- rating: String,
- sample: AnimeBoxesRemoteResource,
- score: i16,
- source: String,
- tag_artist: String,
- tag_character: String,
- tag_copyright: String,
- tag_general: String,
- tags: String,
-}
+ #[derive(Serialize, Deserialize, Debug)]
+ #[serde(deny_unknown_fields)]
+ pub struct Favorite {
+ #[serde(rename(serialize = "dateAdded", deserialize = "dateAdded"))]
+ pub date_added: DateTime,
+ #[serde(rename(serialize = "disableStorage", deserialize = "disableStorage"))]
+ pub disable_storage: bool,
+ #[serde(rename(
+ serialize = "enforceOriginalImage",
+ deserialize = "enforceOriginalImage"
+ ))]
+ pub enforce_original_image: bool,
+ pub file: RemoteResource,
+ pub has_children: bool,
+ pub has_comments: bool,
+ pub has_notes: bool,
+ #[serde(rename(serialize = "imageIsVisible", deserialize = "imageIsVisible"))]
+ pub image_is_visible: bool,
+ #[serde(rename(serialize = "isFavorite", deserialize = "isFavorite"))]
+ pub is_favorite: bool,
+ #[serde(rename(serialize = "isVisible", deserialize = "isVisible"))]
+ pub is_visible: bool,
+ pub jpeg: RemoteResource,
+ pub md5: String,
+ pub parent_id: String,
+ #[serde(rename(serialize = "ppostId", deserialize = "ppostId"))]
+ pub ppost_id: String,
+ #[serde(rename(serialize = "ppostUrl", deserialize = "ppostUrl"))]
+ pub ppost_url: String,
+ pub preview: RemoteResource,
+ pub rating: String,
+ pub sample: RemoteResource,
+ pub score: i16,
+ pub source: String,
+ pub tag_artist: String,
+ pub tag_character: String,
+ pub tag_copyright: String,
+ pub tag_general: String,
+ pub tags: String,
+ }
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(deny_unknown_fields)]
-struct AnimeBoxesRemoteResource {
- #[serde(rename(serialize = "contentType", deserialize = "contentType"))]
- content_type: i8,
- ext: String,
- height: i16,
- url: String,
- width: i16,
-}
+ #[derive(Serialize, Deserialize, Debug)]
+ #[serde(deny_unknown_fields)]
+ pub struct RemoteResource {
+ #[serde(rename(serialize = "contentType", deserialize = "contentType"))]
+ pub content_type: i8,
+ pub ext: String,
+ pub height: i16,
+ pub url: String,
+ pub width: i16,
+ }
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(deny_unknown_fields)]
-struct AnimeBoxesSearch {
- #[serde(rename(serialize = "itemId", deserialize = "itemId"))]
- item_id: i32,
- #[serde(rename(serialize = "searchDate", deserialize = "searchDate"))]
- search_date: DateTime,
- #[serde(rename(serialize = "searchText", deserialize = "searchText"))]
- search_text: String,
- starred: bool,
-}
+ #[derive(Serialize, Deserialize, Debug)]
+ #[serde(deny_unknown_fields)]
+ pub struct Search {
+ #[serde(rename(serialize = "itemId", deserialize = "itemId"))]
+ pub item_id: i32,
+ #[serde(rename(serialize = "searchDate", deserialize = "searchDate"))]
+ pub search_date: DateTime,
+ #[serde(rename(serialize = "searchText", deserialize = "searchText"))]
+ pub search_text: String,
+ pub starred: bool,
+ }
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(deny_unknown_fields)]
-struct AnimeBoxesServer {
- #[serde(rename(serialize = "apikey", deserialize = "apikey"))]
- api_key: String,
- #[serde(rename(serialize = "isDefault", deserialize = "isDefault"))]
- is_default: bool,
- #[serde(rename(serialize = "isSelected", deserialize = "isSelected"))]
- is_selected: bool,
- password: String,
- #[serde(rename(serialize = "passwordKey", deserialize = "passwordKey"))]
- password_key: String,
- #[serde(rename(serialize = "ratingFilterEnabled", deserialize = "ratingFilterEnabled"))]
- rating_filter_enabled: bool,
- #[serde(rename(serialize = "realURL", deserialize = "realURL"))]
- real_url: String,
- #[serde(rename(serialize = "serverId", deserialize = "serverId"))]
- server_id: i16,
- #[serde(rename(serialize = "serverName", deserialize = "serverName"))]
- server_name: String,
- #[serde(rename(serialize = "type", deserialize = "type"))]
- type_: i16,
- url: String,
- #[serde(rename(
- serialize = "useNativeAutocomplete",
- deserialize = "useNativeAutocomplete"
- ))]
- use_native_autocomplete: bool,
- #[serde(rename(serialize = "userName", deserialize = "userName"))]
- user_name: String,
+ #[derive(Serialize, Deserialize, Debug)]
+ #[serde(deny_unknown_fields)]
+ pub struct Server {
+ #[serde(rename(serialize = "apikey", deserialize = "apikey"))]
+ pub api_key: String,
+ #[serde(rename(serialize = "isDefault", deserialize = "isDefault"))]
+ pub is_default: bool,
+ #[serde(rename(serialize = "isSelected", deserialize = "isSelected"))]
+ pub is_selected: bool,
+ pub password: String,
+ #[serde(rename(serialize = "passwordKey", deserialize = "passwordKey"))]
+ pub password_key: String,
+ #[serde(rename(serialize = "ratingFilterEnabled", deserialize = "ratingFilterEnabled"))]
+ pub rating_filter_enabled: bool,
+ #[serde(rename(serialize = "realURL", deserialize = "realURL"))]
+ pub real_url: String,
+ #[serde(rename(serialize = "serverId", deserialize = "serverId"))]
+ pub server_id: i16,
+ #[serde(rename(serialize = "serverName", deserialize = "serverName"))]
+ pub server_name: String,
+ #[serde(rename(serialize = "type", deserialize = "type"))]
+ pub server_type: i16,
+ pub url: String,
+ #[serde(rename(
+ serialize = "useNativeAutocomplete",
+ deserialize = "useNativeAutocomplete"
+ ))]
+ pub use_native_autocomplete: bool,
+ #[serde(rename(serialize = "userName", deserialize = "userName"))]
+ pub user_name: String,
+ }
}