use core::option::Option;
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Hyperlink {
#[serde(skip_serializing_if = "String::is_empty")]
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub report_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sheet_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sight_id: Option<u64>,
}
impl Hyperlink {
pub fn with_url<S: Into<String>>(url: S) -> Self {
Self {
url: url.into(),
..Default::default()
}
}
}
impl From<&str> for Hyperlink {
fn from(value: &str) -> Self {
Self::with_url(value)
}
}
impl From<String> for Hyperlink {
fn from(value: String) -> Self {
Self::with_url(value)
}
}
#[cfg(test)]
mod tests {
use super::*;
use indoc::indoc;
#[test]
fn test_link() {
let link = Hyperlink {
sheet_id: Some(12345),
..Default::default()
};
assert_eq!(
serde_json::to_string_pretty(&link).unwrap(),
indoc! {r#"
{
"sheetId": 12345
}
"#}
.trim()
)
}
}