farmsim 0.1.2

Bindings/API schemas for all compatible Farming Simulator titles
Documentation
use serde::{
  Deserialize,
  Serialize
};

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Economy {
  pub great_demands: GreatDemands,
  pub fill_types:    FillTypes
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GreatDemands {
  #[serde(rename = "greatDemand", default)]
  pub great_demand: Vec<GreatDemand>
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FillTypes {
  #[serde(rename = "fillType", default)]
  pub fill_type: Vec<FillType>
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GreatDemand {
  #[serde(rename = "@uniqueId")]
  pub unique_id:         String,
  #[serde(rename = "@fillTypeName")]
  pub fill_type_name:    String,
  #[serde(rename = "@demandMultiplier")]
  pub demand_multiplier: f32,
  #[serde(rename = "@demandStartDay")]
  pub demand_start_day:  i32,
  #[serde(rename = "@demandStartHour")]
  pub demand_start_hour: i32,
  #[serde(rename = "@demandDuration")]
  pub demand_duration:   i32,
  #[serde(rename = "@isRunning")]
  pub is_running:        String,
  #[serde(rename = "@isValid")]
  pub is_valid:          String
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FillType {
  #[serde(rename = "@fillType")]
  pub fill_type:    String,
  #[serde(rename = "@totalAmount")]
  pub total_amount: Option<i32>,
  #[serde(default)]
  pub history:      Option<History>
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct History {
  #[serde(rename = "period", default)]
  pub periods: Vec<Period>
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Period {
  #[serde(rename = "@period")]
  pub period: SeasonPeriod,
  #[serde(rename = "#text")]
  pub value:  i32
}

#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SeasonPeriod {
  #[default]
  EarlySpring,
  MidSpring,
  LateSpring,

  EarlySummer,
  MidSummer,
  LateSummer,

  EarlyAutumn,
  MidAutumn,
  LateAutumn,

  EarlyWinter,
  MidWinter,
  LateWinter
}

impl std::fmt::Display for SeasonPeriod {
  fn fmt(
    &self,
    f: &mut std::fmt::Formatter<'_>
  ) -> std::fmt::Result {
    let (period, season) = match self {
      SeasonPeriod::EarlySpring => ("Early", "Spring"),
      SeasonPeriod::MidSpring => ("Mid", "Spring"),
      SeasonPeriod::LateSpring => ("Late", "Spring"),

      SeasonPeriod::EarlySummer => ("Early", "Summer"),
      SeasonPeriod::MidSummer => ("Mid", "Summer"),
      SeasonPeriod::LateSummer => ("Late", "Summer"),

      SeasonPeriod::EarlyAutumn => ("Early", "Autumn"),
      SeasonPeriod::MidAutumn => ("Mid", "Autumn"),
      SeasonPeriod::LateAutumn => ("Late", "Autumn"),

      SeasonPeriod::EarlyWinter => ("Early", "Winter"),
      SeasonPeriod::MidWinter => ("Mid", "Winter"),
      SeasonPeriod::LateWinter => ("Late", "Winter")
    };
    write!(f, "{period} {season}")
  }
}

pub fn calculate_economy_price(base_price: i32) -> i32 {
  let multiplier = 3.16f32;
  (base_price as f32 * multiplier).round() as i32
}