Folks, I’m getting stuck on a pretty simple issue using strum
and serde
crates is Rust.
First of all, I have this struct below:
use enums::Timezone;
use crate::CustomError;
use serde::{Deserialize, Serialize};
use serde_json::{from_str, to_string};
#[derive(Clone, Deserialize, Serialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct LocaleConfig {
pub timezone: Timezone,
pub language: String,
}
impl LocaleConfig {
fn from_json_str(json_str: &str) -> Result<Self, CustomError> {
from_str(json_str)?
}
As you can see, I’m using a Timezone
enum that follows:
use serde::{Deserialize, Serialize};
use strum_macros::{Display, EnumIter, EnumString};
#[derive(Clone, Copy, Deserialize, Serialize, Debug, PartialEq, EnumString, EnumIter, Display)]
pub enum Timezone {
#[serde(rename = "GMT-12")]
#[strum(serialize = "GMT-12")]
UTCm12,
#[serde(rename = "GMT-11")]
#[strum(serialize = "GMT-11")]
UTCm11,
...
#[serde(rename = "GMT+11")]
#[strum(serialize = "GMT+11")]
UTCp11,
#[serde(rename = "GMT+12")]
#[strum(serialize = "GMT+12")]
UTCp12,
}
The problem is that when I run LocaleConfig::from_json_str
I get the following error:
Custom Error { title: "Serde Json Error", description: "unknown variant `timezone`, expected `Ok` or `Err` at line 1 column 11" }
As you can infer, CustomError
is just a wrapper for my crates error. Also, please note that LocaleConfig
and Timezone
are located in different modules.
enums/Cargo.toml
[package]
name = "enums"
[dependencies]
serde = { workspace = true }
serde_json = { workspace = true }
strum = { version = "0.26.2" }
strum_macros = { version = "0.26.2" }
config/Cargo.toml
[package]
name = "config"
[dependencies]
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
enums = { workspace = true }
And finally, my virtual manifest uses the versions that follow:
[workspace.dependencies.serde]
serde = { version = "1.0.197", features = ["derive"] }
[workspace.dependencies.serde_json]
version = "1.0.114"
What am I missing here? I mean, when I run: Timezone::from_str("GMT-5");
, I get the correct enum
, but I understand that the desererialize
fn
being run may differ.
Any insights on this matter?