use std::num::NonZeroU32;
use serde::{Deserialize, Serialize};
use super::{Bracket, PerStatus, PhaseOut};
use crate::plan::Dollars;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(default, deny_unknown_fields, rename_all = "kebab-case")]
pub struct StateParams {
pub deduction: PerStatus<Dollars>,
pub brackets: PerStatus<Vec<Bracket>>,
pub taxes_social_security: bool,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub exclusions: Vec<Exclusion>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub taxes_deferrals: bool,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub deduction_unindexed: bool,
#[serde(skip_serializing_if = "crate::plan::is_default")]
pub deduction_at_65: PerStatus<Dollars>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deduction_until_agi: Option<PerStatus<Dollars>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub federal_tax_subtraction: Option<FederalTaxSubtraction>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exemption_credit: Option<ExemptionCredit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gains_excise: Option<GainsExcise>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct FederalTaxSubtraction {
pub cap: Dollars,
pub steps: NonZeroU32,
pub phase_out: PerStatus<PhaseOut>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct ExemptionCredit {
pub per_person: Dollars,
#[serde(default, skip_serializing_if = "crate::plan::is_default")]
pub at_65: Dollars,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub until_agi: Option<PerStatus<Dollars>>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub unindexed: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct GainsExcise {
pub deduction: Dollars,
pub brackets: Vec<Bracket>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct Exclusion {
pub sources: Vec<Source>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from_age: Option<f64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
#[serde(rename_all = "kebab-case")]
pub enum Source {
Wages,
Pension,
Distribution,
EarlyDistribution,
Conversion,
Other,
}
impl Source {
pub const ALL: &'static [Self] = &[
Self::Wages,
Self::Pension,
Self::Distribution,
Self::EarlyDistribution,
Self::Conversion,
Self::Other,
];
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Wages => "wages",
Self::Pension => "pension",
Self::Distribution => "distribution",
Self::EarlyDistribution => "early-distribution",
Self::Conversion => "conversion",
Self::Other => "other",
}
}
}