Compare commits

..

2 Commits

Author SHA1 Message Date
Agatha Lovelace 5285c4cfe2
Release 0.2.0 2024-01-08 21:39:06 +01:00
Agatha Lovelace 42b4582092
Update CI; Clean up flake.nix 2024-01-08 21:35:03 +01:00
8 changed files with 118 additions and 202 deletions

View File

@ -27,5 +27,3 @@ jobs:
- uses: cachix/install-nix-action@v23 - uses: cachix/install-nix-action@v23
- name: Lint - name: Lint
run: nix develop --command cargo clippy --all-targets --all-features run: nix develop --command cargo clippy --all-targets --all-features
- name: Test
run: nix develop --command cargo test

121
Cargo.lock generated
View File

@ -98,9 +98,9 @@ dependencies = [
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.21.7" version = "0.21.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" checksum = "c79fed4cdb43e993fcdadc7e58a09fd0e3e649c4436fa11da71c9f1f3ee7feb9"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
@ -110,9 +110,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.4.2" version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]] [[package]]
name = "block" name = "block"
@ -239,12 +239,6 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "diff"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
[[package]] [[package]]
name = "dlib" name = "dlib"
version = "0.5.2" version = "0.5.2"
@ -294,9 +288,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
[[package]] [[package]]
name = "fdeflate" name = "fdeflate"
version = "0.3.4" version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd"
dependencies = [ dependencies = [
"simd-adler32", "simd-adler32",
] ]
@ -359,9 +353,9 @@ dependencies = [
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.12" version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
@ -404,9 +398,9 @@ dependencies = [
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.3.4" version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
[[package]] [[package]]
name = "idna" name = "idna"
@ -420,13 +414,14 @@ dependencies = [
[[package]] [[package]]
name = "image" name = "image"
version = "0.24.8" version = "0.24.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"byteorder", "byteorder",
"color_quant", "color_quant",
"num-rational",
"num-traits", "num-traits",
"png", "png",
"tiff", "tiff",
@ -461,9 +456,9 @@ checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
[[package]] [[package]]
name = "jpeg-decoder" name = "jpeg-decoder"
version = "0.3.1" version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
[[package]] [[package]]
name = "knuffel" name = "knuffel"
@ -516,9 +511,9 @@ dependencies = [
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.4.13" version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -663,6 +658,27 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "num-integer"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]] [[package]]
name = "num-traits" name = "num-traits"
version = "0.2.17" version = "0.2.17"
@ -779,15 +795,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.29" version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
[[package]] [[package]]
name = "png" name = "png"
version = "0.17.11" version = "0.17.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"crc32fast", "crc32fast",
@ -796,16 +812,6 @@ dependencies = [
"miniz_oxide", "miniz_oxide",
] ]
[[package]]
name = "pretty_assertions"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
dependencies = [
"diff",
"yansi",
]
[[package]] [[package]]
name = "proc-macro-error" name = "proc-macro-error"
version = "1.0.4" version = "1.0.4"
@ -832,9 +838,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.78" version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -874,11 +880,11 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.30" version = "0.38.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316"
dependencies = [ dependencies = [
"bitflags 2.4.2", "bitflags 2.4.1",
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
@ -905,9 +911,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.13.1" version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
[[package]] [[package]]
name = "smawk" name = "smawk"
@ -942,9 +948,9 @@ dependencies = [
[[package]] [[package]]
name = "supports-unicode" name = "supports-unicode"
version = "2.1.0" version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f850c19edd184a205e883199a261ed44471c81e39bd95b1357f5febbef00e77a" checksum = "4b6c2cb240ab5dd21ed4906895ee23fe5a48acdbd15a3ce388e7b62a9b66baf7"
dependencies = [ dependencies = [
"is-terminal", "is-terminal",
] ]
@ -1027,9 +1033,9 @@ dependencies = [
[[package]] [[package]]
name = "tiff" name = "tiff"
version = "0.9.1" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
dependencies = [ dependencies = [
"flate2", "flate2",
"jpeg-decoder", "jpeg-decoder",
@ -1067,9 +1073,9 @@ dependencies = [
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.15" version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
@ -1123,7 +1129,6 @@ dependencies = [
"knuffel", "knuffel",
"memoize", "memoize",
"miette", "miette",
"pretty_assertions",
"url", "url",
"wildmatch", "wildmatch",
] ]
@ -1160,7 +1165,7 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3" checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3"
dependencies = [ dependencies = [
"bitflags 2.4.2", "bitflags 2.4.1",
"nix", "nix",
"wayland-backend", "wayland-backend",
"wayland-scanner", "wayland-scanner",
@ -1172,7 +1177,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c"
dependencies = [ dependencies = [
"bitflags 2.4.2", "bitflags 2.4.1",
"wayland-backend", "wayland-backend",
"wayland-client", "wayland-client",
"wayland-scanner", "wayland-scanner",
@ -1184,7 +1189,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
dependencies = [ dependencies = [
"bitflags 2.4.2", "bitflags 2.4.1",
"wayland-backend", "wayland-backend",
"wayland-client", "wayland-client",
"wayland-protocols", "wayland-protocols",
@ -1215,9 +1220,9 @@ dependencies = [
[[package]] [[package]]
name = "weezl" name = "weezl"
version = "0.1.8" version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
[[package]] [[package]]
name = "wildmatch" name = "wildmatch"
@ -1430,12 +1435,6 @@ dependencies = [
"nix", "nix",
] ]
[[package]]
name = "yansi"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.32" version = "0.7.32"

View File

@ -14,8 +14,5 @@ arboard = { version = "3.3.0", features = ["wayland-data-control"] }
knuffel = "3.0.0" knuffel = "3.0.0"
memoize = { version = "0.4.0", features = ["full"] } memoize = { version = "0.4.0", features = ["full"] }
miette = { version = "5.7.0", features = ["fancy"] } miette = { version = "5.7.0", features = ["fancy"] }
url = "2.5.0" url = "2.3.1"
wildmatch = "2.1.1" wildmatch = "2.1.1"
[dev-dependencies]
pretty_assertions = "1.4.0"

View File

@ -50,7 +50,7 @@ url-eater.inputs.nixpkgs.follows = "nixpkgs"; # optional
``` ```
3. Import NixOS module 3. Import NixOS module
```nix ```nix
imports = [ url-eater.nixosModules.default ]; imports = [ url-eater.nixosModule ];
``` ```
4. Configure the module: 4. Configure the module:
```nix ```nix
@ -74,6 +74,7 @@ Clone this repository, then run:
```sh ```sh
cargo build --release cargo build --release
``` ```
You will need Rust 1.65 or newer.
The output binary will be in `target/release/url-eater` The output binary will be in `target/release/url-eater`
Alternatively, Alternatively,

View File

@ -2,9 +2,7 @@
"nodes": { "nodes": {
"naersk": { "naersk": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": "nixpkgs"
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1698420672, "lastModified": 1698420672,
@ -22,6 +20,20 @@
} }
}, },
"nixpkgs": { "nixpkgs": {
"locked": {
"lastModified": 1704161960,
"narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "63143ac2c9186be6d9da6035fa22620018c85932",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1704161960, "lastModified": 1704161960,
"narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=", "narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=",
@ -40,7 +52,7 @@
"root": { "root": {
"inputs": { "inputs": {
"naersk": "naersk", "naersk": "naersk",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs_2",
"utils": "utils" "utils": "utils"
} }
}, },

View File

@ -1,31 +1,18 @@
{ {
inputs = { inputs = {
naersk.url = "github:nix-community/naersk/master"; naersk.url = "github:nix-community/naersk/master";
naersk.inputs.nixpkgs.follows = "nixpkgs";
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
utils.url = "github:numtide/flake-utils"; utils.url = "github:numtide/flake-utils";
}; };
outputs = outputs = { self, nixpkgs, utils, naersk }:
{ utils.lib.eachDefaultSystem (system:
self,
nixpkgs,
utils,
naersk,
}:
utils.lib.eachDefaultSystem (
system:
let let
pkgs = import nixpkgs { inherit system; }; pkgs = import nixpkgs { inherit system; };
naersk-lib = pkgs.callPackage naersk { }; naersk-lib = pkgs.callPackage naersk { };
in in {
{ packages.default = naersk-lib.buildPackage ./.;
packages.default = naersk-lib.buildPackage { devShells.default = with pkgs;
src = ./.;
buildInputs = with pkgs; lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.AppKit ];
};
devShells.default =
with pkgs;
mkShell { mkShell {
buildInputs = [ buildInputs = [
cargo cargo
@ -37,21 +24,11 @@
]; ];
RUST_SRC_PATH = rustPlatform.rustLibSrc; RUST_SRC_PATH = rustPlatform.rustLibSrc;
}; };
} }) // {
) nixosModules.default = { config, lib, pkgs, ... }:
// {
nixosModules.default =
{
config,
lib,
pkgs,
...
}:
with lib; with lib;
let let cfg = config.services.url-eater;
cfg = config.services.url-eater; in {
in
{
options.services.url-eater = { options.services.url-eater = {
enable = mkEnableOption "Enables the URL Eater service"; enable = mkEnableOption "Enables the URL Eater service";
filters = mkOption { filters = mkOption {
@ -71,12 +48,10 @@
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
systemd.user.services."url-eater" = systemd.user.services."url-eater" = let
let
filters = pkgs.writeText "filters.kdl" cfg.filters; filters = pkgs.writeText "filters.kdl" cfg.filters;
pkg = self.packages.${pkgs.system}.default; pkg = self.defaultPackage.${pkgs.system};
in in {
{
description = "Clipboard URL cleanup service"; description = "Clipboard URL cleanup service";
after = [ "graphical-session-pre.target" ]; after = [ "graphical-session-pre.target" ];

View File

@ -1,16 +1,13 @@
use arboard::Clipboard; use arboard::Clipboard;
use memoize::memoize; use memoize::memoize;
use miette::{miette, Result}; use miette::{miette, Result};
use std::{borrow::Cow, env, time::Duration}; use std::{env, time::Duration};
use url::Url; use url::Url;
use wildmatch::WildMatch; use wildmatch::WildMatch;
mod config; mod config;
use config::Config; use config::Config;
#[cfg(test)]
mod tests;
/// How often should clipboard be checked for changes (0 will result in high CPU usage) /// How often should clipboard be checked for changes (0 will result in high CPU usage)
const ITERATION_DELAY: Duration = Duration::from_millis(250); const ITERATION_DELAY: Duration = Duration::from_millis(250);
@ -73,7 +70,7 @@ fn clean_url(text: String, patterns: Vec<String>) -> Result<String, String> {
.query_pairs() .query_pairs()
.filter(|x| !WildMatch::new(param).matches(&x.0)); .filter(|x| !WildMatch::new(param).matches(&x.0));
// Replace parameters in URL // Replace parameters in URL
replace_query(&mut url, query); url.query_pairs_mut().clear().extend_pairs(query);
} }
} else { } else {
// Filter parameters to exclude blocked entries // Filter parameters to exclude blocked entries
@ -81,23 +78,12 @@ fn clean_url(text: String, patterns: Vec<String>) -> Result<String, String> {
.query_pairs() .query_pairs()
.filter(|x| !WildMatch::new(pattern).matches(&x.0)); .filter(|x| !WildMatch::new(pattern).matches(&x.0));
// Replace parameters in URL // Replace parameters in URL
replace_query(&mut url, query); url.query_pairs_mut().clear().extend_pairs(query);
} }
} }
Ok(url.to_string()) // Handle dangling ?s when no query pairs are appended
} let url = url.as_str().trim_end_matches('?').to_owned();
fn replace_query<'a>( Ok(url)
url: &mut Url,
query_pairs: impl IntoIterator<Item = (Cow<'a, str>, Cow<'a, str>)>,
) {
url.set_query(None);
for (k, v) in query_pairs {
if v.is_empty() {
url.query_pairs_mut().append_key_only(&k);
} else {
url.query_pairs_mut().append_pair(&k, &v);
}
}
} }

View File

@ -1,52 +0,0 @@
use super::*;
#[cfg(test)]
use pretty_assertions::assert_eq;
const PATTERNS: [&str; 2] = ["delete_me", "test@example.com"];
#[test]
fn query_parameters() -> Result<(), String> {
for (url, expected) in [
("http://test.org/meow", "http://test.org/meow"),
("http://test.org/page?delete_me", "http://test.org/page"),
(
"http://test.org/page?delete_me&keep_me",
"http://test.org/page?keep_me",
),
] {
assert_eq!(
clean_url(
url.to_owned(),
PATTERNS.into_iter().map(|v| v.into()).collect()
)?,
expected.to_owned()
);
}
Ok(())
}
#[test]
fn url_fragments() -> Result<(), String> {
for (url, expected) in [
(
"http://test.org/page?delete_me#fragment",
"http://test.org/page#fragment",
),
(
"http://test.org/page#fragment",
"http://test.org/page#fragment",
),
] {
assert_eq!(
clean_url(
url.to_owned(),
PATTERNS.into_iter().map(|v| v.into()).collect()
)?,
expected.to_owned()
);
}
Ok(())
}