-
-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[#83] Create 'AssetError' and refactor 'select_asset' function to return it #97
Changes from 6 commits
9f0f719
9bf1197
41ee6ad
53b7360
7ea1c3f
1a9f95d
184f7d9
87ce034
9d14b27
8f68103
0f634af
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,52 @@ | ||
use serde::Deserialize; | ||
use std::fmt::{Display, Formatter}; | ||
|
||
#[derive(Deserialize, Debug)] | ||
pub struct Release { | ||
pub tag_name: String, | ||
pub assets: Vec<Asset>, | ||
} | ||
|
||
#[derive(Deserialize, Debug, Clone)] | ||
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)] | ||
pub struct Asset { | ||
pub id: u32, | ||
pub name: String, | ||
pub size: u64, | ||
} | ||
|
||
#[derive(Debug, PartialEq, Eq)] | ||
pub enum AssetError { | ||
/// Asset name of this OS is unknown | ||
NameUnknown, | ||
|
||
/// Asset name is not in the fetched assets | ||
NotFound(String), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
In this context, There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah I struggled with naming these two errors, |
||
} | ||
|
||
impl Display for AssetError { | ||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||
match self { | ||
Self::NameUnknown => { | ||
write!( | ||
f, | ||
"Don't know the asset name for this OS: specify it explicitly in the config" | ||
) | ||
zixuan-x marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
Self::NotFound(asset_name) => { | ||
write!(f, "No asset matching name: {}", asset_name) | ||
} | ||
} | ||
} | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use super::*; | ||
|
||
#[test] | ||
fn display_asset_error() { | ||
let asset_name = "test_asset"; | ||
let error_str = AssetError::NotFound(asset_name.to_string()).to_string(); | ||
assert_ne!(error_str.find(asset_name), None); | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's remove this test. It doesn't test much so there's no need to maintain it There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. agree, testing error messages is generally brittle |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
use super::release::Asset; | ||
use crate::infra::client::Client; | ||
use crate::model::asset_name::AssetName; | ||
use crate::model::release::AssetError; | ||
|
||
#[derive(Debug, PartialEq, Eq)] | ||
pub enum Tool { | ||
|
@@ -69,16 +70,15 @@ pub struct ToolInfo { | |
} | ||
|
||
impl ToolInfo { | ||
pub fn select_asset(&self, assets: &[Asset]) -> Result<Asset, String> { | ||
/// Select an Asset from all Assets based on which Operating System is used | ||
pub fn select_asset(&self, assets: &[Asset]) -> Result<Asset, AssetError> { | ||
match self.asset_name.get_name_by_os() { | ||
None => Err(String::from( | ||
"Don't know the asset name for this OS: specify it explicitly in the config", | ||
)), | ||
None => Err(AssetError::NameUnknown), | ||
Some(asset_name) => { | ||
let asset = assets.iter().find(|&asset| asset.name.contains(asset_name)); | ||
|
||
match asset { | ||
None => Err(format!("No asset matching name: {}", asset_name)), | ||
None => Err(AssetError::NotFound(asset_name.to_owned())), | ||
Some(asset) => Ok(asset.clone()), | ||
} | ||
} | ||
|
@@ -107,3 +107,92 @@ pub struct ToolAsset { | |
/// GitHub API client that produces the stream for downloading the asset | ||
pub client: Client, | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use super::*; | ||
Comment on lines
+111
to
+113
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Great work on tests! 👏🏻 Let's also add one more test for the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good catch. added |
||
|
||
#[test] | ||
fn asset_fount() { | ||
let asset_name = "asset"; | ||
|
||
let tool_info = ToolInfo { | ||
owner: "owner".to_string(), | ||
repo: "repo".to_string(), | ||
exe_name: "exe".to_string(), | ||
tag: ToolInfoTag::Latest, | ||
asset_name: AssetName { | ||
linux: Some(asset_name.to_string()), | ||
macos: Some(asset_name.to_string()), | ||
windows: Some(asset_name.to_string()), | ||
}, | ||
}; | ||
|
||
let assets = vec![ | ||
Asset { | ||
id: 1, | ||
name: "1".to_string(), | ||
size: 10, | ||
}, | ||
Asset { | ||
id: 2, | ||
name: asset_name.to_string(), | ||
size: 50, | ||
}, | ||
Asset { | ||
id: 3, | ||
name: "3".to_string(), | ||
size: 77, | ||
}, | ||
]; | ||
|
||
assert_eq!( | ||
tool_info.select_asset(&assets), | ||
Ok(Asset { | ||
id: 2, | ||
name: asset_name.to_string(), | ||
size: 50 | ||
}) | ||
); | ||
} | ||
|
||
#[test] | ||
fn asset_not_found() { | ||
let asset_name = "asset"; | ||
|
||
let tool_info = ToolInfo { | ||
owner: "owner".to_string(), | ||
repo: "repo".to_string(), | ||
exe_name: "exe".to_string(), | ||
tag: ToolInfoTag::Latest, | ||
asset_name: AssetName { | ||
linux: Some(asset_name.to_string()), | ||
macos: Some(asset_name.to_string()), | ||
windows: Some(asset_name.to_string()), | ||
}, | ||
}; | ||
|
||
let assets = vec![ | ||
Asset { | ||
id: 1, | ||
name: "1".to_string(), | ||
size: 10, | ||
}, | ||
Asset { | ||
id: 2, | ||
name: "2".to_string(), | ||
size: 50, | ||
}, | ||
Asset { | ||
id: 3, | ||
name: "3".to_string(), | ||
size: 77, | ||
}, | ||
]; | ||
|
||
assert_eq!( | ||
tool_info.select_asset(&assets), | ||
Err(AssetError::NotFound(asset_name.to_string())) | ||
); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the documentation fix! 🙏🏻