whatsapp_export_parser/
messages.rs1use chrono::NaiveDateTime;
2use std::ops::Range;
3
4#[cfg(feature = "serde-1")]
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq)]
9#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
10#[cfg_attr(feature = "serde-1", serde(rename_all = "kebab-case"))]
11pub struct Message {
12 pub meta: Metadata,
14 pub body: Body,
16 pub span: Span,
18}
19
20#[derive(Debug, Clone, PartialEq)]
22#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
23#[cfg_attr(feature = "serde-1", serde(rename_all = "kebab-case"))]
24pub struct Metadata {
25 pub timestamp: NaiveDateTime,
27 pub sender: String,
29 pub span: Span,
31}
32
33#[derive(Debug, Clone, PartialEq)]
35#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
36#[cfg_attr(feature = "serde-1", serde(rename_all = "kebab-case", tag = "type"))]
37pub enum Body {
38 DirectMessage(DirectMessage),
40 Attachment(Attachment),
42}
43
44impl From<DirectMessage> for Body {
45 fn from(other: DirectMessage) -> Body { Body::DirectMessage(other) }
46}
47
48impl From<Attachment> for Body {
49 fn from(other: Attachment) -> Body { Body::Attachment(other) }
50}
51
52#[derive(Debug, Clone, PartialEq)]
54#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
55#[cfg_attr(feature = "serde-1", serde(rename_all = "kebab-case"))]
56pub struct DirectMessage {
57 pub content: String,
59 pub span: Span,
61}
62
63#[derive(Debug, Clone, PartialEq)]
65#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
66#[cfg_attr(feature = "serde-1", serde(rename_all = "kebab-case"))]
67pub struct Attachment {
68 pub name: String,
70 pub span: Span,
72}
73
74#[derive(Debug, Copy, Clone, PartialEq, Eq)]
76#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
77#[cfg_attr(feature = "serde-1", serde(rename_all = "kebab-case"))]
78pub struct Span {
79 pub start: usize,
81 pub end: usize,
83}
84
85impl Span {
86 pub const fn new(start: usize, end: usize) -> Self { Span { start, end } }
88
89 pub const fn as_range(self) -> Range<usize> { self.start..self.end }
91
92 pub fn get(self, text: &str) -> Option<&str> { text.get(self.as_range()) }
97}