visa_rs/
session.rs

1use std::marker::PhantomData;
2
3use visa_sys as vs;
4
5/// Raw visa session.
6pub type RawSs = vs::ViSession;
7
8/// An owned visa session.
9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10pub struct OwnedSs {
11    s: RawSs,
12}
13
14/// A borrowed visa session.
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16pub struct BorrowedSs<'b> {
17    s: RawSs,
18    _phantom: PhantomData<&'b RawSs>,
19}
20
21impl Drop for OwnedSs {
22    fn drop(&mut self) {
23        unsafe {
24            vs::viClose(self.s);
25        }
26    }
27}
28
29impl BorrowedSs<'_> {
30    /// # Safety
31    ///
32    /// The `ss` passed in must be a valid VISA session.
33
34    pub unsafe fn borrow_raw(ss: RawSs) -> Self {
35        Self {
36            s: ss,
37            _phantom: PhantomData,
38        }
39    }
40}
41
42/// A trait to extract the raw visa session from an underlying object.
43pub trait AsRawSs {
44    fn as_raw_ss(&self) -> RawSs;
45}
46
47/// A trait to express the ability to construct an object from a raw visa session.
48pub trait FromRawSs {
49    /// # Safety
50    ///
51    /// The `ss` passed in must be a valid VISA session.
52    unsafe fn from_raw_ss(ss: RawSs) -> Self;
53}
54
55/// A trait to express the ability to consume an object and acquire ownership of its raw visa session.
56pub trait IntoRawSs {
57    fn into_raw_ss(self) -> RawSs;
58}
59
60/// A trait to borrow the visa session from an underlying object.
61pub trait AsSs {
62    fn as_ss(&self) -> BorrowedSs<'_>;
63}
64
65impl AsRawSs for BorrowedSs<'_> {
66    fn as_raw_ss(&self) -> RawSs {
67        self.s
68    }
69}
70
71impl AsRawSs for OwnedSs {
72    fn as_raw_ss(&self) -> RawSs {
73        self.s
74    }
75}
76
77impl IntoRawSs for OwnedSs {
78    fn into_raw_ss(self) -> RawSs {
79        let ss = self.s;
80        std::mem::forget(self);
81        ss
82    }
83}
84
85impl FromRawSs for OwnedSs {
86    unsafe fn from_raw_ss(s: RawSs) -> Self {
87        Self { s }
88    }
89}
90
91impl<T: AsSs> AsSs for &T {
92    #[inline]
93    fn as_ss(&self) -> BorrowedSs<'_> {
94        T::as_ss(self)
95    }
96}
97
98impl<T: AsSs> AsSs for &mut T {
99    #[inline]
100    fn as_ss(&self) -> BorrowedSs<'_> {
101        T::as_ss(self)
102    }
103}
104
105impl AsSs for BorrowedSs<'_> {
106    #[inline]
107    fn as_ss(&self) -> BorrowedSs<'_> {
108        *self
109    }
110}
111
112impl AsSs for OwnedSs {
113    #[inline]
114    fn as_ss(&self) -> BorrowedSs<'_> {
115        unsafe { BorrowedSs::borrow_raw(self.s) }
116    }
117}