Skip to content

Commit 095fbad

Browse files
authored
Merge pull request #51 from corn-config/fix/serde-numeric-keys
Fix serde numeric keys
2 parents 51b15af + 419c7e6 commit 095fbad

13 files changed

Lines changed: 443 additions & 310 deletions

File tree

Cargo.lock

Lines changed: 361 additions & 283 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,32 +49,29 @@ indexmap = { version = "2.7.1", features = ["serde"] }
4949
# Error handling
5050
thiserror = "2.0.12"
5151

52-
# Utilities
53-
cfg-if = "1.0.0"
54-
5552
# WASM support (optional)
5653
wasm-bindgen = { version = "0.2.100", optional = true }
5754
serde-wasm-bindgen = { version = "0.6.5", optional = true }
5855
console_error_panic_hook = { version = "0.1.7", optional = true }
5956
wee_alloc = { version = "0.4.5", optional = true }
6057

6158
# Lua support (optional)
62-
mlua = { version = "0.10.3", features = [
59+
mlua = { version = "0.11.5", features = [
6360
"module",
6461
"macros",
6562
"serialize",
6663
], optional = true }
6764

6865
# Benchmarking (optional)
69-
criterion = { version = "0.5.1", features = ["html_reports"], optional = true }
66+
criterion = { version = "0.8.1", features = ["html_reports"], optional = true }
7067

7168
[dev-dependencies]
7269
paste = "1.0.15"
7370
wasm-bindgen-test = { version = "0.3.50" }
7471
serde_json = "1.0.140"
7572
serde_norway = "0.9.42"
7673
serde_bytes = "0.11.16"
77-
toml_edit = { version = "0.22.24", features = ["serde"] }
74+
toml_edit = { version = "0.24.0", features = ["serde"] }
7875

7976
[profile.release]
8077
lto = true

assets/inputs/numeric_keys.corn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
foo = { 0 = "low" 33 = "medium" 67 = "high" }
3+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"foo": {
3+
"0": "low",
4+
"33": "medium",
5+
"67": "high"
6+
}
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[foo]
2+
0 = "low"
3+
33 = "medium"
4+
67 = "high"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
foo:
2+
0: low
3+
33: medium
4+
67: high
5+

cli/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ description = "CLI for Corn. A simple and pain-free configuration language."
77
repository = "https://github.com/corn-config/corn"
88
categories = ["config", "command-line-utilities"]
99
keywords = ["configuration", "language", "pest", "peg", "cli"]
10-
authors = ["Jake Stanger <mail@jakestanger.com>"]
10+
authors = ["Jake Stanger <mail@jstanger.dev>"]
1111
readme = "README.md"
1212
homepage = "https://cornlang.dev/"
1313
documentation = "https://docs.rs/corn-cli"
@@ -18,8 +18,7 @@ clap = { version = "4.5.31", features = ["derive", "cargo"] }
1818
colored = "3.0.0"
1919

2020
# (De)serialization
21-
serde = { version = "1.0.218", features = ["derive"] }
2221
serde_json = "1.0.140"
2322
serde_norway = "0.9.42"
2423
libcorn = { version = "0.10.0", path = ".." }
25-
toml_edit = { version = "0.22.24", features = ["serde"] }
24+
toml_edit = { version = "0.24.0", features = ["serde"] }

src/de.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ impl<'de> Map<'de> {
370370
Value::Object(values) => Self {
371371
values: values
372372
.into_iter()
373-
.flat_map(|(key, value)| vec![Value::String(key), value])
373+
.flat_map(|(key, value)| vec![key.into(), value])
374374
.collect(),
375375
},
376376
_ => unreachable!(),
@@ -474,7 +474,7 @@ impl<'de> EnumAccess<'de> for Enum<'de> {
474474
Value::Object(obj) => {
475475
let first_pair = obj.into_iter().next();
476476
if let Some(first_pair) = first_pair {
477-
let value = Value::String(first_pair.0);
477+
let value = first_pair.0.into();
478478
let tag = seed.deserialize(&mut Deserializer::from_value(value))?;
479479
Ok((tag, Variant::new(Some(first_pair.1))))
480480
} else {

src/grammar.pest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ path = ${
3333
}
3434

3535
path_seg = _{
36-
quoted_path_seg | regular_path_seg
36+
integer | quoted_path_seg | regular_path_seg
3737
}
3838

3939
quoted_path_seg = ${ "'" ~ quoted_path_val ~ "'" }

src/lib.rs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,37 @@ mod wasm;
2727
/// The names include their `$` prefix.
2828
pub type Inputs<'a> = HashMap<&'a str, Value<'a>>;
2929

30+
#[derive(Serialize, Debug, Clone, PartialEq, Eq, Hash)]
31+
#[serde(untagged)]
32+
pub enum Key<'a> {
33+
String(Cow<'a, str>),
34+
Integer(i64),
35+
}
36+
37+
impl Display for Key<'_> {
38+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
39+
write!(
40+
f,
41+
"{}",
42+
match self {
43+
Key::String(val) => val.to_string(),
44+
Key::Integer(val) => val.to_string(),
45+
}
46+
)
47+
}
48+
}
49+
50+
impl<'a> From<Key<'a>> for Value<'a> {
51+
fn from(value: Key<'a>) -> Self {
52+
match value {
53+
Key::String(val) => Value::String(val),
54+
Key::Integer(val) => Value::Integer(val),
55+
}
56+
}
57+
}
58+
3059
/// A map of keys to their values.
31-
pub type Object<'a> = IndexMap<Cow<'a, str>, Value<'a>>;
60+
pub type Object<'a> = IndexMap<Key<'a>, Value<'a>>;
3261

3362
#[derive(Serialize, Debug, Clone)]
3463
#[serde(untagged)]

0 commit comments

Comments
 (0)