1use eyre::{eyre, Result};
2use lux_lib::package::PackageReq;
3use std::{path::PathBuf, str::FromStr};
4
5#[derive(Debug, Clone)]
6pub enum PackageOrRockspec {
7 Package(PackageReq),
8 RockSpec(PathBuf),
9}
10
11impl FromStr for PackageOrRockspec {
12 type Err = eyre::Error;
13
14 fn from_str(s: &str) -> Result<Self, Self::Err> {
15 let path = PathBuf::from(s);
16 if path.is_file() {
17 Ok(Self::RockSpec(path))
18 } else {
19 let pkg = PackageReq::from_str(s).map_err(|err| {
20 eyre!(
21 "No file {0} found and cannot parse package query: {1}",
22 s,
23 err
24 )
25 })?;
26 Ok(Self::Package(pkg))
27 }
28 }
29}