docx_reader/documents/elements/
hyperlink.rs

1use serde::Serialize;
2
3use super::*;
4use crate::types::*;
5use crate::{create_hyperlink_rid, generate_hyperlink_id};
6
7#[derive(Serialize, Debug, Clone, PartialEq)]
8#[serde(tag = "type")]
9#[serde(rename_all = "camelCase")]
10pub enum HyperlinkData {
11	External {
12		rid: String,
13		// path is writer only
14		#[serde(skip_serializing_if = "String::is_empty")]
15		path: String,
16	},
17	Anchor {
18		anchor: String,
19	},
20}
21
22#[derive(Serialize, Debug, Clone, PartialEq)]
23#[serde(rename_all = "camelCase")]
24pub struct Hyperlink {
25	#[serde(flatten)]
26	pub link: HyperlinkData,
27	pub history: Option<usize>,
28	pub children: Vec<ParagraphChild>,
29}
30
31impl Hyperlink {
32	pub fn new(value: impl Into<String>, t: HyperlinkType) -> Self {
33		let link = {
34			match t {
35				HyperlinkType::External => HyperlinkData::External {
36					rid: create_hyperlink_rid(generate_hyperlink_id()),
37					path: value.into(),
38				},
39				HyperlinkType::Anchor => HyperlinkData::Anchor {
40					anchor: value.into(),
41				},
42			}
43		};
44		Hyperlink {
45			link,
46			history: None,
47			children: vec![],
48		}
49	}
50
51	pub fn add_run(mut self, run: Run) -> Self {
52		self.children.push(ParagraphChild::Run(Box::new(run)));
53		self
54	}
55
56	pub fn add_structured_data_tag(mut self, t: StructuredDataTag) -> Self {
57		self.children
58			.push(ParagraphChild::StructuredDataTag(Box::new(t)));
59		self
60	}
61
62	pub fn add_insert(mut self, insert: Insert) -> Self {
63		self.children.push(ParagraphChild::Insert(insert));
64		self
65	}
66
67	pub fn add_delete(mut self, delete: Delete) -> Self {
68		self.children.push(ParagraphChild::Delete(delete));
69		self
70	}
71}