summaryrefslogtreecommitdiffstats
path: root/src/process/artifact.rs
blob: 54f88b091abe79acdd2a884bef343c9eb1a516af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use std::fmt::{Debug, Formatter};

use anyhow::Error;

use crate::{
	input::Event,
	module::{ExitStatus, State},
	search::Searchable,
};

#[allow(variant_size_differences)]
pub(crate) enum Artifact {
	ChangeState(State),
	EnqueueResize,
	Error(Error, Option<State>),
	Event(Event),
	ExitStatus(ExitStatus),
	ExternalCommand((String, Vec<String>)),
	SearchCancel,
	SearchTerm(String),
	Searchable(Box<dyn Searchable>),
}

impl Debug for Artifact {
	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
		match *self {
			Self::ChangeState(state) => write!(f, "ChangeState({state:?})"),
			Self::EnqueueResize => write!(f, "EnqueueResize"),
			Self::Error(ref err, state) => write!(f, "Error({err}, {state:?})"),
			Self::Event(event) => write!(f, "Event({event:?})"),
			Self::ExitStatus(status) => write!(f, "ExitStatus({status:?})"),
			Self::ExternalCommand((ref command, ref args)) => write!(f, "ExternalCommand({command:?}, {args:?})"),
			Self::SearchCancel => write!(f, "SearchCancel"),
			Self::SearchTerm(ref term) => write!(f, "SearchTerm({term:?})"),
			Self::Searchable(_) => write!(f, "Searchable(dyn Searchable)"),
		}
	}
}

#[cfg(test)]
mod tests {
	use anyhow::anyhow;
	use rstest::rstest;

	use super::*;
	use crate::{
		search::{Interrupter, SearchResult},
		test_helpers::mocks,
	};

	#[rstest]
	#[case::change_state(Artifact::ChangeState(State::List), "ChangeState(List)")]
	#[case::enqueue_resize(Artifact::EnqueueResize, "EnqueueResize")]
	#[case::error(Artifact::Error(anyhow!("Error"), Some(State::List)), "Error(Error, Some(List))")]
	#[case::event(Artifact::Event(Event::None), "Event(None)")]
	#[case::exit_status(Artifact::ExitStatus(ExitStatus::Abort), "ExitStatus(Abort)")]
	#[case::external_command(Artifact::ExternalCommand((String::from("foo"), vec![])), "ExternalCommand(\"foo\", [])")]
	#[case::search_cancel(Artifact::SearchCancel, "SearchCancel")]
	#[case::search_term(Artifact::SearchTerm(String::from("foo")), "SearchTerm(\"foo\")")]
	#[case::searchable(
		Artifact::Searchable(Box::new(mocks::Searchable::new())),
		"Searchable(dyn Searchable)"
	)]
	fn debug(#[case] artifact: Artifact, #[case] expected: &str) {
		assert_eq!(format!("{artifact:?}"), expected);
	}
}