1use crate::{common::PRNumber, doc_filename::DocFileName};
4use serde::Serialize;
5use std::path::PathBuf;
6
7#[derive(Debug, PartialEq, Eq, Hash, Serialize)]
9pub enum PRDocSource {
10 File(PathBuf),
12
13 Number(PRNumber),
15
16 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}