From c6ed2e2596e7450130b45c337022e2b5165857da Mon Sep 17 00:00:00 2001 From: Ali Bektas Date: Tue, 2 Jan 2024 23:28:53 +0100 Subject: [PATCH 1/2] First successful test for RATOML Given keys, we can search for them within a given str. Right now this is possible for RATOML case, which means that we need to have a unified solution for both RATOML and Cargo.toml --- Cargo.lock | 235 +++++++++++++++++++++++++---- crates/rust-analyzer/Cargo.toml | 1 + crates/rust-analyzer/src/config.rs | 79 ++++++++++ 3 files changed, 289 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7310ecc8582a..ab13b7a2409e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,26 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + [[package]] name = "always-assert" version = "0.1.3" @@ -38,6 +58,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "arrayvec" version = "0.7.4" @@ -82,6 +108,12 @@ dependencies = [ "vfs", ] +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + [[package]] name = "bitflags" version = "1.3.2" @@ -94,6 +126,16 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +[[package]] +name = "bstr" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "byteorder" version = "1.4.3" @@ -166,7 +208,7 @@ checksum = "329427f28cd2bddaacd47c4dcd3d7082d315c61fb164394c690fe98c1b6ee9d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", "synstructure", ] @@ -204,7 +246,7 @@ dependencies = [ "chalk-ir", "ena", "indexmap", - "itertools", + "itertools 0.12.0", "petgraph", "rustc-hash", "tracing", @@ -320,7 +362,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -416,6 +458,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "form_urlencoded" version = "1.2.0" @@ -440,12 +488,36 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +[[package]] +name = "globset" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -478,7 +550,7 @@ dependencies = [ "hir-def", "hir-expand", "hir-ty", - "itertools", + "itertools 0.12.0", "once_cell", "profile", "rustc-hash", @@ -507,7 +579,7 @@ dependencies = [ "hir-expand", "indexmap", "intern", - "itertools", + "itertools 0.12.0", "la-arena 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "limit", "mbe", @@ -537,7 +609,7 @@ dependencies = [ "expect-test", "hashbrown", "intern", - "itertools", + "itertools 0.12.0", "la-arena 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "limit", "mbe", @@ -570,7 +642,7 @@ dependencies = [ "hir-def", "hir-expand", "intern", - "itertools", + "itertools 0.12.0", "la-arena 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "limit", "nohash-hasher", @@ -619,7 +691,7 @@ dependencies = [ "ide-db", "ide-diagnostics", "ide-ssr", - "itertools", + "itertools 0.12.0", "nohash-hasher", "oorandom", "profile", @@ -646,7 +718,7 @@ dependencies = [ "expect-test", "hir", "ide-db", - "itertools", + "itertools 0.12.0", "profile", "smallvec", "sourcegen", @@ -666,7 +738,7 @@ dependencies = [ "expect-test", "hir", "ide-db", - "itertools", + "itertools 0.12.0", "once_cell", "profile", "smallvec", @@ -689,7 +761,7 @@ dependencies = [ "fst", "hir", "indexmap", - "itertools", + "itertools 0.12.0", "limit", "line-index 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "memchr", @@ -722,7 +794,7 @@ dependencies = [ "expect-test", "hir", "ide-db", - "itertools", + "itertools 0.12.0", "once_cell", "profile", "serde_json", @@ -742,7 +814,7 @@ dependencies = [ "expect-test", "hir", "ide-db", - "itertools", + "itertools 0.12.0", "nohash-hasher", "parser", "stdx", @@ -803,6 +875,15 @@ dependencies = [ "triomphe", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.0" @@ -917,7 +998,7 @@ dependencies = [ "hir-expand", "ide", "ide-db", - "itertools", + "itertools 0.12.0", "proc-macro-api", "project-model", "span", @@ -943,6 +1024,29 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +[[package]] +name = "logos" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-derive" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c" +dependencies = [ + "beef", + "fnv", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 1.0.109", +] + [[package]] name = "lsp-server" version = "0.7.4" @@ -1339,7 +1443,7 @@ dependencies = [ "cargo_metadata", "cfg", "expect-test", - "itertools", + "itertools 0.12.0", "la-arena 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "paths", "profile", @@ -1432,7 +1536,7 @@ checksum = "66a9424018828155a3e3596515598f90e68427d8f35eff6df7f0856c73fc58a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", "synstructure", ] @@ -1494,6 +1598,41 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + [[package]] name = "rowan" version = "0.15.15" @@ -1524,7 +1663,7 @@ dependencies = [ "ide", "ide-db", "ide-ssr", - "itertools", + "itertools 0.12.0", "load-cargo", "lsp-server 0.7.4", "lsp-types", @@ -1547,6 +1686,7 @@ dependencies = [ "sourcegen", "stdx", "syntax", + "taplo", "test-fixture", "test-utils", "tikv-jemallocator", @@ -1589,7 +1729,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1676,7 +1816,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1699,7 +1839,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1763,13 +1903,24 @@ dependencies = [ "always-assert", "backtrace", "crossbeam-channel", - "itertools", + "itertools 0.12.0", "jod-thread", "libc", "miow", "winapi", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.39" @@ -1789,7 +1940,7 @@ checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", "unicode-xid", ] @@ -1801,7 +1952,7 @@ dependencies = [ "either", "expect-test", "indexmap", - "itertools", + "itertools 0.12.0", "once_cell", "parser", "proc-macro2", @@ -1820,6 +1971,27 @@ dependencies = [ "ungrammar", ] +[[package]] +name = "taplo" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d22577122cf37c9aea9a9363f6f01bddaa1977617fe5abc59e221f23d114817" +dependencies = [ + "ahash", + "arc-swap", + "either", + "globset", + "itertools 0.10.5", + "logos", + "once_cell", + "rowan", + "serde", + "serde_json", + "thiserror", + "time", + "tracing", +] + [[package]] name = "test-fixture" version = "0.0.0" @@ -1849,7 +2021,7 @@ dependencies = [ name = "text-edit" version = "0.0.0" dependencies = [ - "itertools", + "itertools 0.12.0", "text-size", ] @@ -1876,7 +2048,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -1926,8 +2098,10 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" dependencies = [ + "itoa", "serde", "time-core", + "time-macros", ] [[package]] @@ -1936,6 +2110,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -1977,7 +2160,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml index a9bf4d8c3363..31b05e2eea2c 100644 --- a/crates/rust-analyzer/Cargo.toml +++ b/crates/rust-analyzer/Cargo.toml @@ -35,6 +35,7 @@ serde.workspace = true num_cpus = "1.15.0" mimalloc = { version = "0.1.30", default-features = false, optional = true } lsp-server.workspace = true +taplo = "0.12.1" tracing.workspace = true tracing-subscriber.workspace = true tracing-log = "0.2.0" diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 258f74106395..abdad9e9b201 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -28,6 +28,10 @@ use project_model::{ }; use rustc_hash::{FxHashMap, FxHashSet}; use serde::{de::DeserializeOwned, Deserialize}; +use taplo::{ + dom::{node::Key, KeyOrIndex, Keys}, + parser, +}; use vfs::{AbsPath, AbsPathBuf}; use crate::{ @@ -39,6 +43,17 @@ use crate::{ mod patch_old_style; +/// Where are configurations coming from? +/// There are two sources : +/// 1. Client sends them in its `InitializationOptions` in JSON format. +/// 2. .rust-analyzer.toml in TOML format. +enum ConfigSource { + Client(serde_json::Value), + RATOML(TomlContent), +} + +struct TomlContent(String); + // Conventions for configuration keys to preserve maximal extendability without breakage: // - Toggles (be it binary true/false or with more options in-between) should almost always suffix as `_enable` // This has the benefit of namespaces being extensible, and if the suffix doesn't fit later it can be changed without breakage. @@ -2119,6 +2134,43 @@ macro_rules! _config_data { },)* ]) } + + + } + + + impl TryFrom for ConfigData { + type Error = Vec; + + fn try_from(value: TomlContent) -> Result { + let content = value.0.as_str(); + let parsed = parser::parse(content); + + if !parsed.errors.is_empty() { + eprintln!("There are errors."); + return Err(parsed.errors) + } + + let dom = parsed.into_dom(); + $({ + let subkeys = stringify!($field) + .split("_") + .into_iter() + .map(|sfix| KeyOrIndex::Key(Key::new(sfix))); + let keys = Keys::new(subkeys); + let matches = dom.find_all_matches(keys , true); + + if let Ok(o) = matches { + o.into_iter().for_each(|elem| { + dbg!(&elem.0); + dbg!(&elem.1); + }); + } + + })* + + Ok(ConfigData::default()) + } } #[test] @@ -2738,4 +2790,31 @@ mod tests { matches!(config.flycheck(), FlycheckConfig::CargoCommand { target_dir, .. } if target_dir == Some(PathBuf::from("other_folder"))) ); } + + mod ratoml { + use crate::config::{ConfigData, ConfigSource, TomlContent}; + + #[test] + fn test_1() { + let toml_file: &'static str = r#" +[assist] +emitMustUse = true +expressionFillDefault = "todo" + +[cargo] +buildScripts.enable = true + +[cargo.buildScripts] +invocationLocation = "workspace" +"#; + let config = TomlContent(toml_file.to_string()); + let data: Result = config.try_into(); + + if let Ok(config) = data { + eprintln!("YUPPI"); + } else { + eprintln!("Oh no it failed."); + } + } + } } From d14b2dabbffc2b61d469872d58a5ed633f583462 Mon Sep 17 00:00:00 2001 From: Ali Bektas Date: Thu, 4 Jan 2024 11:32:31 +0100 Subject: [PATCH 2/2] Ask Veykril --- Cargo.lock | 17 +++++++ Cargo.toml | 1 + crates/toml-sema/Cargo.toml | 15 ++++++ crates/toml-sema/src/lib.rs | 96 +++++++++++++++++++++++++++++++++++ crates/toml-syntax/Cargo.toml | 12 +++++ crates/toml-syntax/src/lib.rs | 7 +++ 6 files changed, 148 insertions(+) create mode 100644 crates/toml-sema/Cargo.toml create mode 100644 crates/toml-sema/src/lib.rs create mode 100644 crates/toml-syntax/Cargo.toml create mode 100644 crates/toml-syntax/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index ab13b7a2409e..2c860fbddf64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2134,6 +2134,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml-sema" +version = "0.0.0" +dependencies = [ + "either", + "semver", + "serde", + "toml-syntax", +] + +[[package]] +name = "toml-syntax" +version = "0.0.0" +dependencies = [ + "taplo", +] + [[package]] name = "toolchain" version = "0.0.0" diff --git a/Cargo.toml b/Cargo.toml index d4cff420bcb5..2fa255bf6f0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,6 +75,7 @@ stdx = { path = "./crates/stdx", version = "0.0.0" } syntax = { path = "./crates/syntax", version = "0.0.0" } text-edit = { path = "./crates/text-edit", version = "0.0.0" } toolchain = { path = "./crates/toolchain", version = "0.0.0" } +toml-syntax = { path = "./crates/toml-syntax", version = "0.0.0" } tt = { path = "./crates/tt", version = "0.0.0" } vfs-notify = { path = "./crates/vfs-notify", version = "0.0.0" } vfs = { path = "./crates/vfs", version = "0.0.0" } diff --git a/crates/toml-sema/Cargo.toml b/crates/toml-sema/Cargo.toml new file mode 100644 index 000000000000..9ad0a875ae55 --- /dev/null +++ b/crates/toml-sema/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "toml-sema" +version = "0.0.0" +rust-version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +toml-syntax.workspace = true +semver.workspace = true +either.workspace = true +serde.workspace = true \ No newline at end of file diff --git a/crates/toml-sema/src/lib.rs b/crates/toml-sema/src/lib.rs new file mode 100644 index 000000000000..a31b22f3e477 --- /dev/null +++ b/crates/toml-sema/src/lib.rs @@ -0,0 +1,96 @@ +#![allow(dead_code)] +use semver; +use serde::Deserializer; +use std::collections::HashMap; +use toml_syntax::dom; + +struct Semantics { + dict: HashMap, +} + +struct KeyValuePair { + key: dom::Keys, + value: Value, +} + +struct Optional { + default: T, +} + +enum Value { + Optional(Optional), + Mandatory(T), +} + +enum ValueInner { + Bool(bool), + Integer(Integer), + String(String), + Semver(semver::Version), + SemverReq(semver::VersionReq), +} + +enum Integer { + RangedInteger(Ranged), + Integer(i32), +} + +struct Ranged { + lower: T, + upper: T, +} + +enum String { + + EitherOf(T), +} + +fn str_to_keys(s: &'_ str) -> dom::Keys { + let subkeys = s.split(".").into_iter().map(|sfix| { + assert!(!sfix.is_empty()); + dom::KeyOrIndex::Key(dom::node::Key::new(sfix)) + }); + dom::Keys::new(subkeys) +} + +impl Semantics { + fn new(kvs: Vec<(&str, Value)>) -> Semantics { + Semantics { dict: kvs.into_iter().map(|kv| (str_to_keys(kv.0), kv.1)).collect() } + } +} + +#[cfg(test)] +mod tests { + use serde::Deserialize; + use toml_syntax::dom::{node::Key, KeyOrIndex, Keys}; + + use crate::{KeyValuePair, Optional, Semantics, Value}; + + fn test_1() { + let a = r#" +[assist] +emitMustUse = true +expressionFillDefault = "todo" + +[cargo] +buildScripts.enable = true + +[cargo.buildScripts] +invocationLocation = "workspace" +"#; + let parsed = toml_syntax::parse_toml(a); + let dom = parsed.into_dom(); + + #[derive(Deserialize, Debug, Clone)] + #[serde(rename_all = "snake_case")] + enum ExprFillDefaultDef { + Todo, + Default, + } + + let kv1 = ("assist.emitMustUse", Value::Optional(Optional { default: false })); + let kv2 = ( "assist.expressionFillDefault" , Value::Optional(Optional { default: })); + + let sema = Semantics::new(vec![]); + } +} diff --git a/crates/toml-syntax/Cargo.toml b/crates/toml-syntax/Cargo.toml new file mode 100644 index 000000000000..deadd4eb26e3 --- /dev/null +++ b/crates/toml-syntax/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "toml-syntax" +version = "0.0.0" +rust-version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +taplo = "0.12.1" \ No newline at end of file diff --git a/crates/toml-syntax/src/lib.rs b/crates/toml-syntax/src/lib.rs new file mode 100644 index 000000000000..2f902bb8df12 --- /dev/null +++ b/crates/toml-syntax/src/lib.rs @@ -0,0 +1,7 @@ +use taplo::parser; + +pub use taplo::dom; + +pub fn parse_toml<'a>(content: &'a str) -> parser::Parse { + parser::parse(content) +}