Browse Source

Add simple commands

master
Drew Short 4 years ago
parent
commit
c49b0e48b8
  1. 8
      .idea/dictionaries/drewshort.xml
  2. 7
      Cargo.lock
  3. 1
      Cargo.toml
  4. 57
      src/main.rs
  5. 224
      src/model.rs

8
.idea/dictionaries/drewshort.xml

@ -0,0 +1,8 @@
<component name="ProjectDictionaryState">
<dictionary name="drewshort">
<words>
<w>anime</w>
<w>animeboxes</w>
</words>
</dictionary>
</component>

7
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"

1
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"

57
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<P: AsRef<Path>>(
path: P,
) -> Result<model::AnimeBoxesBackup, Box<dyn Error>> {
) -> Result<model::anime_boxes::Backup, Box<dyn Error>> {
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<String> = 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<String> = 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)
}
}
}

224
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<chrono::Utc>,
#[serde(rename(serialize = "backupVersion", deserialize = "backupVersion"))]
backup_version: String,
#[serde(rename(serialize = "bannedTags", deserialize = "bannedTags"))]
banned_tags: Vec<String>,
#[serde(rename(serialize = "creatorName", deserialize = "creatorName"))]
creator_name: String,
#[serde(rename(serialize = "creatorVersion", deserialize = "creatorVersion"))]
creator_version: String,
favorites: Vec<AnimeBoxesFavorite>,
#[serde(rename(serialize = "searchHistory", deserialize = "searchHistory"))]
search_history: Vec<AnimeBoxesSearch>,
servers: Vec<AnimeBoxesServer>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Backup {
#[serde(rename(serialize = "backupTime", deserialize = "backupTime"))]
pub backup_time: DateTime<chrono::Utc>,
#[serde(rename(serialize = "backupVersion", deserialize = "backupVersion"))]
pub backup_version: String,
#[serde(rename(serialize = "bannedTags", deserialize = "bannedTags"))]
pub banned_tags: Vec<String>,
#[serde(rename(serialize = "creatorName", deserialize = "creatorName"))]
pub creator_name: String,
#[serde(rename(serialize = "creatorVersion", deserialize = "creatorVersion"))]
pub creator_version: String,
pub favorites: Vec<Favorite>,
#[serde(rename(serialize = "searchHistory", deserialize = "searchHistory"))]
pub search_history: Vec<Search>,
pub servers: Vec<Server>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
struct AnimeBoxesFavorite {
#[serde(rename(serialize = "dateAdded", deserialize = "dateAdded"))]
date_added: DateTime<chrono::Utc>,
#[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<chrono::Utc>,
#[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<chrono::Utc>,
#[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<chrono::Utc>,
#[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,
}
}
Loading…
Cancel
Save