use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
use serde_repr::{Deserialize_repr, Serialize_repr};
#[derive(Debug, PartialEq, Clone)]
pub enum GrupoIcms {
IcmsSn202(GrupoIcmsSn202),
Icms60(GrupoIcms60),
}
impl<'de> Deserialize<'de> for GrupoIcms {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let grc = GrupoIcmsContainer::deserialize(deserializer)?;
if let Some(gr) = grc.icms_sn_202 {
return Ok(GrupoIcms::IcmsSn202(gr));
}
if let Some(gr) = grc.icms_60 {
return Ok(GrupoIcms::Icms60(gr));
}
Err(Error::custom("Tipo de ICMS não suportado".to_string()))
}
}
impl Serialize for GrupoIcms {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let grc = match self {
GrupoIcms::IcmsSn202(g) => GrupoIcmsContainer {
icms_sn_202: Some(g.clone()),
icms_60: None,
},
GrupoIcms::Icms60(g) => GrupoIcmsContainer {
icms_sn_202: None,
icms_60: Some(g.clone()),
},
};
grc.serialize(serializer)
}
}
#[derive(Deserialize, Serialize)]
struct GrupoIcmsContainer {
#[serde(rename = "ICMSSN202")]
#[serde(skip_serializing_if = "Option::is_none")]
icms_sn_202: Option<GrupoIcmsSn202>,
#[serde(rename = "ICMS60")]
#[serde(skip_serializing_if = "Option::is_none")]
icms_60: Option<GrupoIcms60>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
pub struct GrupoIcms60 {
#[serde(rename = "$unflatten=orig")]
pub origem: OrigemMercadoria,
#[serde(rename = "$unflatten=vBCSTRet")]
pub valor_base_calculo: f32,
#[serde(rename = "$unflatten=pST")]
pub aliquota: f32,
#[serde(rename = "$unflatten=vICMSSTRet")]
pub valor: f32,
}
#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)]
pub struct GrupoIcmsSn202 {
#[serde(rename = "$unflatten=orig")]
pub origem: OrigemMercadoria,
#[serde(rename = "$unflatten=CSOSN")]
pub codigo_situacao: String,
#[serde(rename = "$unflatten=modBCST")]
pub base_calculo: ModalidadeBaseCalculoIcmsSt,
#[serde(rename = "$unflatten=vBCST")]
pub valor_base_calculo: f32,
#[serde(rename = "$unflatten=pICMSST")]
pub aliquota: f32,
#[serde(rename = "$unflatten=vICMSST")]
pub valor: f32,
}
#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]
#[repr(u8)]
pub enum OrigemMercadoria {
Nacional = 0,
Estrangeira = 1,
EstrangeiraAdquiridaMercadoInterno = 2,
NacionalComImportacao40a70 = 3,
NacionalProducaoEmConformidade = 4,
NacionalComImportacaoInferior40 = 5,
EstrangeiraImportacaoDiretaSemSimilarNacional = 6,
EstrangeiraAdquiridaMercadoInternoSemSimilarNacional = 7,
NacionalComImportacaoSuperior70 = 8,
}
#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize_repr, Serialize_repr)]
#[repr(u8)]
pub enum ModalidadeBaseCalculoIcmsSt {
PrecoTabelado = 0,
ListaNegativa = 1,
ListaPositiva = 2,
ListaNeutra = 3,
MargemValorAgregado = 4,
Pauta = 5,
}