1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use crate::traits::{AsFooter, MarkdownElement}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use std::fmt; #[derive(Clone, Debug, Default)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] pub struct Link { pub text: String, pub url: String, pub footer: bool, pub inlined: bool, } impl Link { pub fn new() -> Self { Self::default() } pub fn from( text: impl Into<String>, url: impl Into<String>, footer: bool, inlined: bool, ) -> Self { Self { text: text.into(), url: url.into(), footer, inlined, } } } impl AsFooter for Link { fn as_footer(&self) -> Box<dyn MarkdownElement> { Box::new(format!("[{}]: {}", self.text, self.url)) } } impl fmt::Display for Link { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let text = if self.footer { format!("[{}][{}]", self.text, self.text) } else { format!("[{}]({})", self.text, self.url) }; if self.inlined { write!(f, "{}", text) } else { writeln!(f, "{}", text) } } }