Allow positional input to imdl torrent show
Input can now be passed to `imdl torrent show` without a flag: imdl torrent show foo.torrent Passing input by flag continues to work. type: changed fixes: - https://github.com/casey/intermodal/issues/375
This commit is contained in:
parent
cecd2f66a5
commit
25ac072985
|
@ -4,7 +4,8 @@ Changelog
|
||||||
|
|
||||||
UNRELEASED - 2020-04-22
|
UNRELEASED - 2020-04-22
|
||||||
-----------------------
|
-----------------------
|
||||||
- :bug: [`xxxxxxxxxxxx`](https://github.com/casey/intermodal/commits/master) Fix help strings - _Casey Rodarmor <casey@rodarmor.com>_
|
- :zap: [`xxxxxxxxxxxx`](https://github.com/casey/intermodal/commits/master) Allow positional input to `imdl torrent show` - Fixes [#375](https://github.com/casey/intermodal/issues/375) - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
|
- :bug: [`cecd2f66a5d6`](https://github.com/casey/intermodal/commit/cecd2f66a5d6a6b44f27f8ca499e359d82d29ab7) Fix help strings - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
- :zap: [`ebec2d591a7a`](https://github.com/casey/intermodal/commit/ebec2d591a7a0e2a2c4cd55217db4ba46b5dd9ed) Allow positional shell to `imdl completions` - Fixes [#375](https://github.com/casey/intermodal/issues/375) - _Casey Rodarmor <casey@rodarmor.com>_
|
- :zap: [`ebec2d591a7a`](https://github.com/casey/intermodal/commit/ebec2d591a7a0e2a2c4cd55217db4ba46b5dd9ed) Allow positional shell to `imdl completions` - Fixes [#375](https://github.com/casey/intermodal/issues/375) - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
- :art: [`134c241ae7f8`](https://github.com/casey/intermodal/commit/134c241ae7f8e374d8a9266e7eb0c4a9c3844c30) Use `lexiclean` crate for lexical path cleaning - _Casey Rodarmor <casey@rodarmor.com>_
|
- :art: [`134c241ae7f8`](https://github.com/casey/intermodal/commit/134c241ae7f8e374d8a9266e7eb0c4a9c3844c30) Use `lexiclean` crate for lexical path cleaning - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
- :zap: [`323434d0aa21`](https://github.com/casey/intermodal/commit/323434d0aa21ebfda5be85ecd4a38a55ed3fec0a) Allow positional input to `imdl torrent verify` - Fixes [#375](https://github.com/casey/intermodal/issues/375) - _Casey Rodarmor <casey@rodarmor.com>_
|
- :zap: [`323434d0aa21`](https://github.com/casey/intermodal/commit/323434d0aa21ebfda5be85ecd4a38a55ed3fec0a) Allow positional input to `imdl torrent verify` - Fixes [#375](https://github.com/casey/intermodal/issues/375) - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
|
|
|
@ -68,7 +68,7 @@ impl Link {
|
||||||
&self.input_positional,
|
&self.input_positional,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let input = env.read(input.clone())?;
|
let input = env.read(input)?;
|
||||||
|
|
||||||
let infohash = Infohash::from_input(&input)?;
|
let infohash = Infohash::from_input(&input)?;
|
||||||
let metainfo = Metainfo::from_input(&input)?;
|
let metainfo = Metainfo::from_input(&input)?;
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
use crate::common::*;
|
use crate::common::*;
|
||||||
|
|
||||||
|
const INPUT_HELP: &str = "Show information about torrent at `INPUT`. If `INPUT` is `-`, read \
|
||||||
|
torrent metainfo from standard input.";
|
||||||
|
|
||||||
|
const INPUT_FLAG: &str = "input-flag";
|
||||||
|
|
||||||
|
const INPUT_POSITIONAL: &str = "<INPUT>";
|
||||||
|
|
||||||
|
const INPUT_VALUE: &str = "INPUT";
|
||||||
|
|
||||||
#[derive(StructOpt)]
|
#[derive(StructOpt)]
|
||||||
#[structopt(
|
#[structopt(
|
||||||
help_message(consts::HELP_MESSAGE),
|
help_message(consts::HELP_MESSAGE),
|
||||||
|
@ -8,20 +17,37 @@ use crate::common::*;
|
||||||
)]
|
)]
|
||||||
pub(crate) struct Show {
|
pub(crate) struct Show {
|
||||||
#[structopt(
|
#[structopt(
|
||||||
|
name = INPUT_FLAG,
|
||||||
long = "input",
|
long = "input",
|
||||||
short = "i",
|
short = "i",
|
||||||
value_name = "PATH",
|
value_name = INPUT_VALUE,
|
||||||
empty_values(false),
|
empty_values(false),
|
||||||
parse(try_from_os_str = InputTarget::try_from_os_str),
|
parse(try_from_os_str = InputTarget::try_from_os_str),
|
||||||
help = "Show information about torrent at `PATH`. If `Path` is `-`, read torrent metainfo \
|
help = INPUT_HELP,
|
||||||
from standard input.",
|
|
||||||
)]
|
)]
|
||||||
input: InputTarget,
|
input_flag: Option<InputTarget>,
|
||||||
|
#[structopt(
|
||||||
|
name = INPUT_POSITIONAL,
|
||||||
|
value_name = INPUT_VALUE,
|
||||||
|
empty_values(false),
|
||||||
|
parse(try_from_os_str = InputTarget::try_from_os_str),
|
||||||
|
required_unless = INPUT_FLAG,
|
||||||
|
conflicts_with = INPUT_FLAG,
|
||||||
|
help = INPUT_HELP,
|
||||||
|
)]
|
||||||
|
input_positional: Option<InputTarget>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Show {
|
impl Show {
|
||||||
pub(crate) fn run(self, env: &mut Env) -> Result<(), Error> {
|
pub(crate) fn run(self, env: &mut Env) -> Result<(), Error> {
|
||||||
let input = env.read(self.input)?;
|
let target = xor_args(
|
||||||
|
"input_flag",
|
||||||
|
&self.input_flag,
|
||||||
|
"input_positional",
|
||||||
|
&self.input_positional,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
let input = env.read(target)?;
|
||||||
let summary = TorrentSummary::from_input(&input)?;
|
let summary = TorrentSummary::from_input(&input)?;
|
||||||
summary.write(env)?;
|
summary.write(env)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -34,6 +60,55 @@ mod tests {
|
||||||
|
|
||||||
use pretty_assertions::assert_eq;
|
use pretty_assertions::assert_eq;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn input_required() {
|
||||||
|
test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"show",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
},
|
||||||
|
matches: Err(Error::Clap { .. }),
|
||||||
|
};
|
||||||
|
|
||||||
|
test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"show",
|
||||||
|
"--input",
|
||||||
|
"foo",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
},
|
||||||
|
matches: Err(Error::Filesystem { .. }),
|
||||||
|
};
|
||||||
|
|
||||||
|
test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"show",
|
||||||
|
"foo",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
},
|
||||||
|
matches: Err(Error::Filesystem { .. }),
|
||||||
|
};
|
||||||
|
|
||||||
|
test_env! {
|
||||||
|
args: [
|
||||||
|
"torrent",
|
||||||
|
"show",
|
||||||
|
"--input",
|
||||||
|
"foo",
|
||||||
|
"foo",
|
||||||
|
],
|
||||||
|
tree: {
|
||||||
|
},
|
||||||
|
matches: Err(Error::Clap { .. }),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn output() -> Result<()> {
|
fn output() -> Result<()> {
|
||||||
let metainfo = Metainfo {
|
let metainfo = Metainfo {
|
||||||
|
@ -99,6 +174,44 @@ Announce List Tier 1: announce
|
||||||
assert_eq!(have, want);
|
assert_eq!(have, want);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut env = TestEnvBuilder::new()
|
||||||
|
.arg_slice(&["imdl", "torrent", "show", "foo.torrent"])
|
||||||
|
.out_is_term()
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let path = env.resolve("foo.torrent")?;
|
||||||
|
|
||||||
|
metainfo.dump(path).unwrap();
|
||||||
|
|
||||||
|
env.assert_ok();
|
||||||
|
|
||||||
|
let have = env.out();
|
||||||
|
let want = " Name foo
|
||||||
|
Comment comment
|
||||||
|
Creation Date 1970-01-01 00:00:01 UTC
|
||||||
|
Created By created by
|
||||||
|
Source source
|
||||||
|
Info Hash e12253978dc6d50db11d05747abcea1ad03b51c5
|
||||||
|
Torrent Size 339 bytes
|
||||||
|
Content Size 20 bytes
|
||||||
|
Private yes
|
||||||
|
Tracker announce
|
||||||
|
Announce List Tier 1: announce
|
||||||
|
b
|
||||||
|
Tier 2: c
|
||||||
|
DHT Nodes x:12
|
||||||
|
1.1.1.1:16
|
||||||
|
[2001:db8:85a3::8a2e:370]:7334
|
||||||
|
Piece Size 16 KiB
|
||||||
|
Piece Count 2
|
||||||
|
File Count 1
|
||||||
|
Files foo
|
||||||
|
";
|
||||||
|
|
||||||
|
assert_eq!(have, want);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut env = TestEnvBuilder::new()
|
let mut env = TestEnvBuilder::new()
|
||||||
.arg_slice(&["imdl", "torrent", "show", "--input", "foo.torrent"])
|
.arg_slice(&["imdl", "torrent", "show", "--input", "foo.torrent"])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user