docx_reader/documents/elements/
hyperlink.rs1use 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 #[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}