1use crate::Error;
2
3#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
4pub struct Snip {
5 pub offset: usize,
6 pub length: usize,
7}
8
9pub trait Localize: Sized {
10 fn localize(self, chars: Snip, bytes: Snip) -> Local<Self> {
11 Local {
12 chars,
13 bytes,
14 data: self,
15 }
16 }
17}
18impl<T: Sized> Localize for T {}
19
20#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
21pub struct Local<E> {
22 chars: Snip,
23 bytes: Snip,
24 data: E,
25}
26impl<E> Local<E> {
27 pub fn into_inner(self) -> (Local<()>, E) {
28 (
29 Local {
30 chars: self.chars,
31 bytes: self.bytes,
32 data: (),
33 },
34 self.data,
35 )
36 }
37 pub fn data(&self) -> &E {
38 &self.data
39 }
40 pub fn chars(&self) -> Snip {
41 self.chars
42 }
43 pub fn bytes(&self) -> Snip {
44 self.bytes
45 }
46
47 pub fn into_position(mut self) -> Local<E> {
48 self.chars.length = 0;
49 self.bytes.length = 0;
50 self
51 }
52
53 pub fn local<T>(&self, data: T) -> Local<T> {
54 Local {
55 chars: self.chars,
56 bytes: self.bytes,
57 data,
58 }
59 }
60 pub fn map<F, T>(self, mut mapper: F) -> Local<T>
61 where
62 F: FnMut(E) -> T,
63 {
64 Local {
65 chars: self.chars,
66 bytes: self.bytes,
67 data: mapper(self.data),
68 }
69 }
70 pub fn with_inner<T>(self, inner: T) -> Local<T> {
71 Local {
72 chars: self.chars,
73 bytes: self.bytes,
74 data: inner,
75 }
76 }
77 pub fn with_shift(mut self, char_offset: usize, byte_offset: usize) -> Local<E> {
78 self.chars.offset += char_offset;
79 self.bytes.offset += byte_offset;
80 self
81 }
82
83 pub fn from_segment<T>(begin: Local<E>, end: Local<T>) -> Result<Local<E>, Error> {
84 if (begin.chars.offset <= end.chars.offset) && (begin.bytes.offset <= end.bytes.offset) {
85 Ok(Local {
86 chars: Snip {
87 offset: begin.chars.offset,
88 length: end.chars.length + end.chars.offset - begin.chars.offset,
89 },
90 bytes: Snip {
91 offset: begin.bytes.offset,
92 length: end.bytes.length + end.bytes.offset - begin.bytes.offset,
93 },
94 data: begin.data,
95 })
96 } else {
97 Err(Error::EndBeforeBegin)
98 }
99 }
100}