Skip to content

Commit

Permalink
icon refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
dbstratta committed Dec 31, 2024
1 parent 619108d commit e727e9c
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/sync/constants.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
pub const AVATAR_IMAGES_DIR_NAME: &'static str = "avatars";
pub const ICON_IMAGES_DIR_NAME: &'static str = "icons";
pub const BUNDLE_IMAGES_DIR_NAME: &'static str = "bundles";
75 changes: 75 additions & 0 deletions src/sync/icon_data.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
use anyhow::{bail, Result};
use rust_decimal::prelude::*;
use serde::{Deserialize, Serialize};
use std::path::PathBuf;

use super::{
helpers::{format_text, full_image_path},
ICON_IMAGES_DIR_NAME,
};
use crate::traits::Hashable;

#[non_exhaustive]
#[derive(medici_macros::Hashable, Serialize, Deserialize, Hash, PartialEq, Eq, Clone, Debug)]
pub struct IconData {
pub key: String,

pub is_initial: bool,
pub description: Option<String>,
pub price_in_uyu: Option<Decimal>,
pub image_file_name: PathBuf,

pub hash: String,
}

impl IconData {
pub fn new(
key: String,
is_initial: bool,
description: Option<String>,
price_in_uyu: Option<Decimal>,
image_file_name: PathBuf,
) -> Result<Self> {
let mut data = Self {
key,
is_initial,
description,
price_in_uyu,
image_file_name,
hash: Default::default(),
};

data.process()?;

Ok(data)
}

fn process(&mut self) -> Result<()> {
self.format();
self.check()?;

self.refresh_hash();

Ok(())
}

fn check(&self) -> Result<()> {
if let Some(price_in_uyu) = self.price_in_uyu {
if price_in_uyu <= Decimal::ZERO {
bail!("invalid icon price");
}
}

Ok(())
}

fn format(&mut self) {
self.key = self.key.trim().to_string();

self.description = self.description.as_deref().map(format_text);
}

pub fn full_image_path(&self) -> String {
full_image_path(&ICON_IMAGES_DIR_NAME, &self.image_file_name)
}
}
2 changes: 2 additions & 0 deletions src/sync/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ mod constants;
mod course_data;
mod explanation_data;
mod helpers;
mod icon_data;
mod question_data;
mod question_option_data;
mod question_source_data;
Expand All @@ -14,6 +15,7 @@ pub use constants::*;
pub use course_data::*;
pub use explanation_data::*;
pub use helpers::*;
pub use icon_data::*;
pub use question_data::*;
pub use question_option_data::*;
pub use question_source_data::*;
Expand Down
11 changes: 7 additions & 4 deletions src/sync/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ use serde::{Deserialize, Serialize};
use uuid::Uuid;

use super::{
BundleData, CourseData, QuestionData, QuestionOptionData, QuestionSourceData, QuestionTopicData,
BundleData, CourseData, IconData, QuestionData, QuestionOptionData, QuestionSourceData,
QuestionTopicData,
};

#[derive(Serialize, Deserialize, Default, Clone, Debug)]
Expand All @@ -17,19 +18,20 @@ pub struct SyncData {
pub question_topics: QuestionTopicsSyncData,
pub question_sources: QuestionSourcesSyncData,
pub bundles: BundlesSyncData,
pub avatar_file_names: HashSet<String>,
pub icons: IconsSyncData,
}

impl Display for SyncData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f,
"Courses: {}\nQuestions: {}\nQuestion options: {}\nQuestion topics: {}\nQuestion sources: {}\nBundles: {}",
"Courses: {}\nQuestions: {}\nQuestion options: {}\nQuestion topics: {}\nQuestion sources: {}\nBundles: {}\nIcons: {}",
self.courses,
self.questions,
self.question_options,
self.question_topics,
self.question_sources,
self.bundles
self.bundles,
self.icons
)
}
}
Expand All @@ -40,6 +42,7 @@ pub type QuestionOptionsSyncData = ElementSyncData<QuestionOptionData, Uuid>;
pub type QuestionTopicsSyncData = ElementSyncData<QuestionTopicData, String>;
pub type QuestionSourcesSyncData = ElementSyncData<QuestionSourceData, String>;
pub type BundlesSyncData = ElementSyncData<BundleData, String>;
pub type IconsSyncData = ElementSyncData<IconData, String>;

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct ElementSyncData<T: Eq + Hash, K: Eq + Hash> {
Expand Down

0 comments on commit e727e9c

Please sign in to comment.