Radish alpha
r
rad:z39mP9rQAaGmERfUMPULfPUi473tY
Radicle terminal user interface
Radicle
Git
chore: Update dependencies and bump to 0.7.0
Merged did:key:z6MkgFq6...nBGz opened 4 months ago
5 files changed +96 -195 de8ae91f 3d24964a
modified Cargo.lock
@@ -134,7 +134,7 @@ version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67555e1f1ece39d737e28c8a017721287753af3f93225e4a445b29ccb0f5912c"
dependencies = [
-
 "nom",
+
 "nom 7.1.3",
 "ratatui",
 "simdutf8",
 "smallvec",
@@ -204,15 +204,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"

[[package]]
-
name = "async-stdin"
-
version = "0.3.1"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b1ff8b5d9b5ec29e0f49583ba71847b8c8888b67a8510133048a380903aa6822"
-
dependencies = [
-
 "tokio",
-
]
-

-
[[package]]
name = "autocfg"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -984,7 +975,7 @@ checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed"
dependencies = [
 "cfg-if",
 "libc",
-
 "libredox 0.1.9",
+
 "libredox",
 "windows-sys 0.60.2",
]

@@ -1409,7 +1400,6 @@ dependencies = [
 "newline-converter",
 "once_cell",
 "tempfile",
-
 "termion",
 "unicode-segmentation",
 "unicode-width 0.1.14",
]
@@ -1428,17 +1418,6 @@ dependencies = [
]

[[package]]
-
name = "io-uring"
-
version = "0.7.10"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
-
dependencies = [
-
 "bitflags 2.9.3",
-
 "cfg-if",
-
 "libc",
-
]
-

-
[[package]]
name = "is_terminal_polyfill"
version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1547,17 +1526,6 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"

[[package]]
name = "libredox"
-
version = "0.0.2"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607"
-
dependencies = [
-
 "bitflags 2.9.3",
-
 "libc",
-
 "redox_syscall 0.4.1",
-
]
-

-
[[package]]
-
name = "libredox"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3"
@@ -1624,9 +1592,9 @@ dependencies = [

[[package]]
name = "log"
-
version = "0.4.27"
+
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"

[[package]]
name = "lru"
@@ -1743,6 +1711,15 @@ dependencies = [
]

[[package]]
+
name = "nom"
+
version = "8.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"
+
dependencies = [
+
 "memchr",
+
]
+

+
[[package]]
name = "nonempty"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1814,12 +1791,6 @@ dependencies = [
]

[[package]]
-
name = "numtoa"
-
version = "0.1.0"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
-

-
[[package]]
name = "object"
version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2372,39 +2343,32 @@ dependencies = [

[[package]]
name = "radicle-tui"
-
version = "0.6.0"
+
version = "0.7.0"
dependencies = [
 "ansi-to-tui",
 "anyhow",
-
 "async-stdin",
 "fuzzy-matcher",
 "git2",
 "homedir",
-
 "inquire",
 "lazy_static",
 "lexopt",
-
 "libc",
 "log",
 "md5",
-
 "nom",
+
 "nom 8.0.0",
 "pretty_assertions",
 "radicle",
 "radicle-cli",
 "radicle-git-ext",
-
 "radicle-signals",
 "radicle-surf",
 "radicle-term",
 "ratatui",
 "serde",
 "serde_json",
-
 "signal-hook",
 "simple-logging",
 "terminal-light",
-
 "textwrap",
-
 "thiserror 2.0.16",
+
 "thiserror 2.0.17",
 "timeago 0.5.0",
 "tokio",
-
 "tokio-stream",
 "tokio-util",
 "tui-textarea",
 "tui-tree-widget",
@@ -2471,15 +2435,6 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"

[[package]]
name = "redox_syscall"
-
version = "0.4.1"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
-
dependencies = [
-
 "bitflags 1.3.2",
-
]
-

-
[[package]]
-
name = "redox_syscall"
version = "0.5.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
@@ -2488,12 +2443,6 @@ dependencies = [
]

[[package]]
-
name = "redox_termios"
-
version = "0.1.3"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb"
-

-
[[package]]
name = "ref-cast"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2589,7 +2538,7 @@ dependencies = [
 "errno",
 "libc",
 "linux-raw-sys 0.4.15",
-
 "windows-sys 0.52.0",
+
 "windows-sys 0.59.0",
]

[[package]]
@@ -2858,24 +2807,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"

[[package]]
-
name = "slab"
-
version = "0.4.11"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
-

-
[[package]]
name = "smallvec"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"

[[package]]
-
name = "smawk"
-
version = "0.3.2"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c"
-

-
[[package]]
name = "socket2"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3118,29 +3055,6 @@ dependencies = [
]

[[package]]
-
name = "termion"
-
version = "2.0.3"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c4648c7def6f2043b2568617b9f9b75eae88ca185dbc1f1fda30e95a85d49d7d"
-
dependencies = [
-
 "libc",
-
 "libredox 0.0.2",
-
 "numtoa",
-
 "redox_termios",
-
]
-

-
[[package]]
-
name = "textwrap"
-
version = "0.16.2"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057"
-
dependencies = [
-
 "smawk",
-
 "unicode-linebreak",
-
 "unicode-width 0.2.0",
-
]
-

-
[[package]]
name = "thiserror"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3151,11 +3065,11 @@ dependencies = [

[[package]]
name = "thiserror"
-
version = "2.0.16"
+
version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
+
checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
dependencies = [
-
 "thiserror-impl 2.0.16",
+
 "thiserror-impl 2.0.17",
]

[[package]]
@@ -3171,9 +3085,9 @@ dependencies = [

[[package]]
name = "thiserror-impl"
-
version = "2.0.16"
+
version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
+
checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
 "proc-macro2",
 "quote",
@@ -3275,29 +3189,26 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"

[[package]]
name = "tokio"
-
version = "1.47.1"
+
version = "1.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
+
checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
dependencies = [
-
 "backtrace",
 "bytes",
-
 "io-uring",
 "libc",
 "mio 1.0.4",
 "parking_lot",
 "pin-project-lite",
 "signal-hook-registry",
-
 "slab",
 "socket2",
 "tokio-macros",
-
 "windows-sys 0.59.0",
+
 "windows-sys 0.61.2",
]

[[package]]
name = "tokio-macros"
-
version = "2.5.0"
+
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
+
checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
 "proc-macro2",
 "quote",
@@ -3305,17 +3216,6 @@ dependencies = [
]

[[package]]
-
name = "tokio-stream"
-
version = "0.1.17"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047"
-
dependencies = [
-
 "futures-core",
-
 "pin-project-lite",
-
 "tokio",
-
]
-

-
[[package]]
name = "tokio-util"
version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3556,12 +3456,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"

[[package]]
-
name = "unicode-linebreak"
-
version = "0.1.5"
-
source = "registry+https://github.com/rust-lang/crates.io-index"
-
checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
-

-
[[package]]
name = "unicode-normalization"
version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
modified Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "radicle-tui"
description = "Radicle terminal user interface"
-
version = "0.6.0"
+
version = "0.7.0"
repository = "https://app.radicle.xyz/nodes/seed.radicle.xyz/rad:z39mP9rQAaGmERfUMPULfPUi473tY"
homepage = "https://radicle.xyz"
license = "MIT OR Apache-2.0"
@@ -24,23 +24,16 @@ required-features = ["bin"]
[dependencies]
ansi-to-tui = { version = "7.0.0" }
anyhow = { version = "1" }
-
async-stdin = { version = "0.3.1" }
-
inquire = { version = "0.7.4", default-features = false, features = [
-
    "termion",
-
    "editor",
-
] }
-
lexopt = { version = "0.3.0" }
+
lexopt = { version = "0.3.1" }
fuzzy-matcher = "0.3.7"
-
homedir = { version = "0.3.3" }
+
homedir = { version = "0.3.6" }
lazy_static = { version = "1.5.0" }
-
libc = { version = "^0.2" }
-
log = { version = "0.4.19" }
-
nom = { version = "^7.0.0" }
+
log = { version = "0.4.29" }
+
nom = { version = "^8.0.0" }
radicle = { version = "0.20.0" }
radicle-term = { version = "0.16.0" }
radicle-cli = { version = "0.17.0" }
-
radicle-surf = { version = "0.22.0" }
-
radicle-signals = { version = "0.11.0" }
+
radicle-surf = { version = "0.22.1" }
ratatui = { version = "0.29.0", default-features = false, features = [
    "all-widgets",
    "crossterm",
@@ -50,19 +43,15 @@ md5 = { version = "0.8.0" }
simple-logging = { version = "2.0.2" }
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0" }
-
signal-hook = { version = "0.3.17" }
timeago = { version = "0.5.0" }
-
# termion = { version = "4.0.5" }
-
terminal-light = { version = "1.4.0" }
-
textwrap = { version = "0.16.0" }
-
thiserror = { version = "2.0.16" }
-
tokio = { version = "1.32.0", features = ["full"] }
+
terminal-light = { version = "1.8.0" }
+
thiserror = { version = "2.0.17" }
+
tokio = { version = "1.48.0", features = ["full"] }
tokio-util = { version = "0.7.17" }
-
tokio-stream = { version = "0.1.14" }
tui-textarea = { version = "0.7.0", default-features = false, features = [
    "crossterm",
] }
-
tui-tree-widget = { version = "0.23.0" }
+
tui-tree-widget = { version = "0.23.1" }

[dev-dependencies]
pretty_assertions = "^1.4.1"
@@ -71,6 +60,6 @@ radicle-git-ext = { version = "0.8.1", features = ["serde"] }


[dev-dependencies.git2]
-
version = "0.19.0"
+
version = "0.19"
default-features = false
features = ["vendored-libgit2"]
modified bin/ui/items.rs
@@ -40,8 +40,8 @@ pub mod filter {
    use nom::character::complete::{char, multispace0};
    use nom::combinator::map;
    use nom::multi::separated_list1;
-
    use nom::sequence::{delimited, tuple};
-
    use nom::IResult;
+
    use nom::sequence::delimited;
+
    use nom::{IResult, Parser};

    use radicle::prelude::Did;

@@ -94,12 +94,12 @@ pub mod filter {
    pub fn parse_did_or(input: &str) -> IResult<&str, DidFilter> {
        map(
            delimited(
-
                tuple((multispace0, char('('), multispace0)),
+
                (multispace0, char('('), multispace0),
                separated_list1(
                    delimited(multispace0, tag_no_case("or"), multispace0),
                    take(56_usize),
                ),
-
                tuple((multispace0, char(')'), multispace0)),
+
                (multispace0, char(')'), multispace0),
            ),
            |dids: Vec<&str>| {
                DidFilter::Or(
@@ -108,7 +108,8 @@ pub mod filter {
                        .collect::<Vec<_>>(),
                )
            },
-
        )(input)
+
        )
+
        .parse(input)
    }
}

@@ -368,7 +369,8 @@ impl FromStr for IssueItemFilter {
                    separated_list0(tag(","), take(56_usize)),
                    tag("]"),
                ),
-
            )(input)
+
            )
+
            .parse(input)
        };

        let mut assignees_parser = |input| -> IResult<&str, Vec<&str>> {
@@ -379,7 +381,8 @@ impl FromStr for IssueItemFilter {
                    separated_list0(tag(","), take(56_usize)),
                    tag("]"),
                ),
-
            )(input)
+
            )
+
            .parse(input)
        };

        let parts = value.split(' ');
modified bin/ui/items/notification.rs
@@ -337,7 +337,7 @@ pub mod filter {
    use nom::character::complete::{char, multispace0};
    use nom::combinator::{map, opt, value};
    use nom::multi::{many0, separated_list1};
-
    use nom::sequence::{delimited, preceded, tuple};
+
    use nom::sequence::{delimited, preceded};
    use nom::IResult;
    use radicle::cob::TypeName;

@@ -519,11 +519,14 @@ pub mod filter {
        type Err = anyhow::Error;

        fn from_str(filter_exp: &str) -> Result<Self, Self::Err> {
+
            use nom::Parser;
+

            fn parse_state(input: &str) -> IResult<&str, NotificationState> {
                alt((
                    value(NotificationState::Seen, tag_no_case("seen")),
                    value(NotificationState::Unseen, tag_no_case("unseen")),
-
                ))(input)
+
                ))
+
                .parse(input)
            }

            fn parse_name(input: &str) -> IResult<&str, &str> {
@@ -548,21 +551,22 @@ pub mod filter {
            fn parse_state_filter(input: &str) -> IResult<&str, NotificationFilter> {
                map(
                    preceded(
-
                        tuple((
+
                        (
                            tag_no_case("state"),
                            multispace0,
                            tag_no_case("="),
                            multispace0,
-
                        )),
+
                        ),
                        parse_state,
                    ),
                    NotificationFilter::State,
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_cob_kind(input: &str) -> IResult<&str, NotificationKind> {
                let (input, _) = tag("cob")(input)?;
-
                let (input, type_name) = opt(preceded(tag(":"), parse_type_name))(input)?;
+
                let (input, type_name) = opt(preceded(tag(":"), parse_type_name)).parse(input)?;

                Ok((
                    input,
@@ -577,7 +581,7 @@ pub mod filter {

            fn parse_branch_kind(input: &str) -> IResult<&str, NotificationKind> {
                let (input, _) = tag("branch")(input)?;
-
                let (input, name) = opt(preceded(tag(":"), parse_name))(input)?;
+
                let (input, name) = opt(preceded(tag(":"), parse_name)).parse(input)?;

                Ok((
                    input,
@@ -592,7 +596,7 @@ pub mod filter {

            fn parse_unknown_kind(input: &str) -> IResult<&str, NotificationKind> {
                let (input, _) = tag("unknown")(input)?;
-
                let (input, refname) = opt(preceded(tag(":"), parse_name))(input)?;
+
                let (input, refname) = opt(preceded(tag(":"), parse_name)).parse(input)?;

                Ok((
                    input,
@@ -603,62 +607,66 @@ pub mod filter {
            }

            fn parse_kind(input: &str) -> IResult<&str, NotificationKind> {
-
                alt((parse_cob_kind, parse_branch_kind, parse_unknown_kind))(input)
+
                alt((parse_cob_kind, parse_branch_kind, parse_unknown_kind)).parse(input)
            }

            fn parse_kind_single(input: &str) -> IResult<&str, NotificationKindFilter> {
-
                map(parse_kind, NotificationKindFilter::Single)(input)
+
                map(parse_kind, NotificationKindFilter::Single).parse(input)
            }

            fn parse_kind_or(input: &str) -> IResult<&str, NotificationKindFilter> {
                map(
                    delimited(
-
                        tuple((multispace0, char('('), multispace0)),
+
                        (multispace0, char('('), multispace0),
                        separated_list1(
                            delimited(multispace0, tag_no_case("or"), multispace0),
                            parse_kind,
                        ),
-
                        tuple((multispace0, char(')'), multispace0)),
+
                        (multispace0, char(')'), multispace0),
                    ),
                    NotificationKindFilter::Or,
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_kind_filter(input: &str) -> IResult<&str, NotificationFilter> {
                map(
                    preceded(
-
                        tuple((
+
                        (
                            tag_no_case("kind"),
                            multispace0,
                            tag_no_case("="),
                            multispace0,
-
                        )),
+
                        ),
                        alt((parse_kind_or, parse_kind_single)),
                    ),
                    NotificationFilter::Kind,
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_author_filter(input: &str) -> IResult<&str, NotificationFilter> {
                map(
                    preceded(
-
                        tuple((
+
                        (
                            tag_no_case("author"),
                            multispace0,
                            tag_no_case("="),
                            multispace0,
-
                        )),
+
                        ),
                        alt((filter::parse_did_single, filter::parse_did_or)),
                    ),
                    NotificationFilter::Author,
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_search_filter(input: &str) -> IResult<&str, NotificationFilter> {
                map(
                    take_while1(|c: char| c.is_alphanumeric() || c == '_' || c == '-'),
                    |s: &str| NotificationFilter::Search(s.to_string()),
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_single_filter(input: &str) -> IResult<&str, NotificationFilter> {
@@ -667,11 +675,12 @@ pub mod filter {
                    parse_kind_filter,
                    parse_author_filter,
                    parse_search_filter,
-
                ))(input)
+
                ))
+
                .parse(input)
            }

            fn parse_filters(input: &str) -> IResult<&str, Vec<NotificationFilter>> {
-
                many0(preceded(multispace0, parse_single_filter))(input)
+
                many0(preceded(multispace0, parse_single_filter)).parse(input)
            }

            let parse_filter_expression = |input: &str| -> Result<NotificationFilter, String> {
modified bin/ui/items/patch.rs
@@ -138,7 +138,7 @@ pub mod filter {
    use nom::character::complete::multispace0;
    use nom::combinator::{map, value};
    use nom::multi::many0;
-
    use nom::sequence::{preceded, tuple};
+
    use nom::sequence::preceded;
    use nom::IResult;

    use radicle::patch::Status;
@@ -247,58 +247,64 @@ pub mod filter {
        type Err = anyhow::Error;

        fn from_str(filter_exp: &str) -> Result<Self, Self::Err> {
+
            use nom::Parser;
+

            fn parse_state(input: &str) -> IResult<&str, Status> {
                alt((
                    value(Status::Open, tag_no_case("open")),
                    value(Status::Merged, tag_no_case("merged")),
                    value(Status::Draft, tag_no_case("draft")),
                    value(Status::Archived, tag_no_case("archived")),
-
                ))(input)
+
                ))
+
                .parse(input)
            }

            fn parse_state_filter(input: &str) -> IResult<&str, PatchFilter> {
                map(
                    preceded(
-
                        tuple((
+
                        (
                            tag_no_case("state"),
                            multispace0,
                            tag_no_case("="),
                            multispace0,
-
                        )),
+
                        ),
                        parse_state,
                    ),
                    PatchFilter::State,
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_author_filter(input: &str) -> IResult<&str, PatchFilter> {
                map(
                    preceded(
-
                        tuple((
+
                        (
                            tag_no_case("author"),
                            multispace0,
                            tag_no_case("="),
                            multispace0,
-
                        )),
+
                        ),
                        alt((filter::parse_did_single, filter::parse_did_or)),
                    ),
                    PatchFilter::Author,
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_search_filter(input: &str) -> IResult<&str, PatchFilter> {
                map(
                    take_while1(|c: char| c.is_alphanumeric() || c == '_' || c == '-'),
                    |s: &str| PatchFilter::Search(s.to_string()),
-
                )(input)
+
                )
+
                .parse(input)
            }

            fn parse_single_filter(input: &str) -> IResult<&str, PatchFilter> {
-
                alt((parse_state_filter, parse_author_filter, parse_search_filter))(input)
+
                alt((parse_state_filter, parse_author_filter, parse_search_filter)).parse(input)
            }

            fn parse_filters(input: &str) -> IResult<&str, Vec<PatchFilter>> {
-
                many0(preceded(multispace0, parse_single_filter))(input)
+
                many0(preceded(multispace0, parse_single_filter)).parse(input)
            }

            let parse_filter_expression = |input: &str| -> Result<PatchFilter, String> {