Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
jdx committed Jan 13, 2024
1 parent dcef2ee commit 8551715
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 70 deletions.
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@ extern crate miette;
#[cfg(test)]
#[macro_use]
extern crate insta;
#[macro_use]
pub mod error;
pub mod complete;
pub mod context;
pub(crate) mod env;
pub mod error;
pub mod parse;

pub use crate::parse::arg::Arg;
Expand Down
72 changes: 3 additions & 69 deletions src/parse/config.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
use std::collections::BTreeMap;

use indexmap::IndexMap;
use kdl::{KdlDocument, KdlEntry, KdlNode, KdlValue};

use crate::bail_parse;
use crate::error::UsageErr;
use crate::parse::helpers::NodeHelper;

#[derive(Debug)]
pub struct SpecConfig {
pub(crate) props: BTreeMap<String, SpecConfigProp>,
pub props: BTreeMap<String, SpecConfigProp>,
}

impl SpecConfig {
Expand Down Expand Up @@ -45,79 +45,13 @@ impl SpecConfigProp {
}
}

#[derive(Debug)]
struct ParseHalp<'a> {
node: &'a KdlNode,
}

#[derive(Debug)]
struct ParseEntry<'a> {
entry: &'a KdlEntry,
value: &'a KdlValue,
}

impl<'a> ParseHalp<'a> {
fn new(node: &'a KdlNode) -> Self {
Self { node }
}

fn name(&self) -> &str {
self.node.name().value()
}

fn arg(&self, i: usize) -> Result<ParseEntry, UsageErr> {
if let Some(entry) = self.node.entries().get(i) {
if entry.name().is_some() {
bail_parse!(entry, "expected argument, got param: {}", entry.to_string())
}
return Ok(entry.into());
}
bail_parse!(self.node, "missing argument")
}

fn props(&self) -> IndexMap<&str, ParseEntry> {
self.node
.entries()
.into_iter()
.filter_map(|e| match e.name() {
Some(key) => Some((key.value(), e.into())),
None => None,
})
.collect()
}
}

impl<'a> From<&'a KdlNode> for ParseHalp<'a> {
fn from(node: &'a KdlNode) -> Self {
Self { node }
}
}

impl<'a> From<&'a KdlEntry> for ParseEntry<'a> {
fn from(entry: &'a KdlEntry) -> Self {
Self {
entry,
value: entry.value(),
}
}
}

impl<'a> ParseEntry<'a> {
fn ensure_string(&self) -> Result<&str, UsageErr> {
match self.value.as_string() {
Some(s) => Ok(s),
None => bail_parse!(self.entry, "expected string"),
}
}
}

impl TryFrom<&KdlNode> for SpecConfig {
type Error = UsageErr;
fn try_from(doc: &KdlNode) -> Result<Self, Self::Error> {
let mut config = Self::default();
if let Some(children) = doc.children().map(|doc| doc.nodes()) {
for node in children {
let ph = ParseHalp::new(node);
let ph = NodeHelper::new(node);
match ph.name() {
"prop" => {
let key = ph.arg(0)?;
Expand Down
69 changes: 69 additions & 0 deletions src/parse/helpers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
use crate::error::UsageErr;
use indexmap::IndexMap;
use kdl::{KdlEntry, KdlNode, KdlValue};

#[derive(Debug)]
pub struct NodeHelper<'a> {
pub(crate) node: &'a KdlNode,
}

impl<'a> NodeHelper<'a> {
pub(crate) fn new(node: &'a KdlNode) -> Self {
Self { node }
}

pub(crate) fn name(&self) -> &str {
self.node.name().value()
}

pub(crate) fn arg(&self, i: usize) -> Result<ParseEntry, UsageErr> {
if let Some(entry) = self.node.entries().get(i) {
if entry.name().is_some() {
bail_parse!(entry, "expected argument, got param: {}", entry.to_string())
}
return Ok(entry.into());
}
bail_parse!(self.node, "missing argument")
}

pub(crate) fn props(&self) -> IndexMap<&str, ParseEntry> {
self.node
.entries()
.into_iter()
.filter_map(|e| match e.name() {
Some(key) => Some((key.value(), e.into())),
None => None,
})
.collect()
}
}

impl<'a> From<&'a KdlNode> for NodeHelper<'a> {
fn from(node: &'a KdlNode) -> Self {
Self { node }
}
}

#[derive(Debug)]
pub(crate) struct ParseEntry<'a> {
pub(crate) entry: &'a KdlEntry,
pub(crate) value: &'a KdlValue,
}

impl<'a> From<&'a KdlEntry> for ParseEntry<'a> {
fn from(entry: &'a KdlEntry) -> Self {
Self {
entry,
value: entry.value(),
}
}
}

impl<'a> ParseEntry<'a> {
pub fn ensure_string(&self) -> Result<&str, UsageErr> {
match self.value.as_string() {
Some(s) => Ok(s),
None => bail_parse!(self.entry, "expected string"),
}
}
}
1 change: 1 addition & 0 deletions src/parse/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ pub mod arg;
pub mod cmd;
pub mod config;
pub mod flag;
pub(crate) mod helpers;
pub mod spec;

0 comments on commit 8551715

Please sign in to comment.