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
use std::borrow::Borrow;
use std::rc::Rc;
use {Object, Pos};

#[derive(Debug)]
pub struct ErrorPos {
    pub object: Box<Object>,
    pub start: usize,
    pub end: usize,
}

impl ErrorPos {
    /// Needs explicit method because object is boxed.
    pub fn clone_error_pos(&self) -> ErrorPos {
        ErrorPos {
            object: self.object.clone_object(),
            start: self.start,
            end: self.end,
        }
    }
}

impl<T: Borrow<Pos>> From<T> for ErrorPos {
    fn from(value: T) -> ErrorPos {
        let value = value.borrow();

        ErrorPos {
            object: (**value.object).clone_object(),
            start: value.start,
            end: value.end,
        }
    }
}

impl From<(Rc<Box<Object>>, usize, usize)> for ErrorPos {
    fn from(value: (Rc<Box<Object>>, usize, usize)) -> Self {
        ErrorPos {
            object: (**value.0).clone_object(),
            start: value.1,
            end: value.2,
        }
    }
}