prdoclib/
prdoc_source.rs

1//! A PRDoc is mostly identified by its `PRNumber` but it can also be identified by its filename.
2
3use crate::{common::PRNumber, doc_filename::DocFileName};
4use serde::Serialize;
5use std::path::PathBuf;
6
7/// This enum defines the initial input used to find a PRDoc.
8#[derive(Debug, PartialEq, Eq, Hash, Serialize)]
9pub enum PRDocSource {
10	/// Filename of the PRDoc
11	File(PathBuf),
12
13	/// PR number of the PRDoc
14	Number(PRNumber),
15
16	/// Filename and PR number of the PRDoc
17	Both(PathBuf, PRNumber),
18}
19
20impl From<PathBuf> for PRDocSource {
21	fn from(file: PathBuf) -> Self {
22		Self::File(file)
23	}
24}
25
26impl From<&PathBuf> for PRDocSource {
27	fn from(file: &PathBuf) -> Self {
28		Self::File(file.clone())
29	}
30}
31
32impl From<PRNumber> for PRDocSource {
33	fn from(number: PRNumber) -> Self {
34		Self::Number(number)
35	}
36}
37
38impl From<(PathBuf, PRNumber)> for PRDocSource {
39	fn from((file, number): (PathBuf, PRNumber)) -> Self {
40		Self::Both(file, number)
41	}
42}
43
44impl From<DocFileName> for PRDocSource {
45	fn from(file: DocFileName) -> Self {
46		Self::File(file.into())
47	}
48}
49
50impl From<&PRDocSource> for PRNumber {
51	fn from(source: &PRDocSource) -> Self {
52		match source {
53			PRDocSource::File(file) => {
54				let file_maybe = DocFileName::try_from(file);
55				match file_maybe {
56					Ok(file) => file.number,
57					Err(_e) => {
58						log::warn!("No PR number could be found in {:#?}", file);
59						0
60					},
61				}
62			},
63			PRDocSource::Number(number) => *number,
64			PRDocSource::Both(_file, number) => *number,
65		}
66	}
67}