1#![doc = include_str!("../README.md")]
2#![no_std]
3#![deny(unsafe_code, missing_docs)]
4
5pub use device_register_macro::*;
6
7pub trait Register {
9 type Address;
11
12 const ADDRESS: Self::Address;
14}
15
16pub trait ReadableRegister: Register {}
18
19pub trait EditableRegister: Register {}
23
24pub trait WritableRegister: Register {}
26
27pub trait RegisterInterface<R, A>
30where
31 R: Register<Address = A>,
32{
33 type Error;
35
36 fn read_register(&mut self) -> Result<R, Self::Error>;
38
39 fn write_register(&mut self, register: &R) -> Result<(), Self::Error>;
41}
42
43pub trait ReadRegister<R, A>
45where
46 R: ReadableRegister<Address = A>,
47{
48 type Error;
50
51 fn read(&mut self) -> Result<R, Self::Error>;
53}
54
55pub trait WriteRegister<R, A>
57where
58 R: WritableRegister<Address = A>,
59{
60 type Error;
62
63 fn write(&mut self, register: R) -> Result<(), Self::Error>;
65}
66
67pub trait EditRegister<R, A>
71where
72 R: EditableRegister<Address = A>,
73{
74 type Error;
76
77 fn edit<F>(&mut self, f: F) -> Result<(), Self::Error>
80 where
81 for<'w> F: FnOnce(&'w mut R);
82}
83
84impl<I, R, A> ReadRegister<R, A> for I
85where
86 R: ReadableRegister<Address = A>,
87 I: RegisterInterface<R, A>,
88{
89 type Error = I::Error;
90
91 fn read(&mut self) -> Result<R, Self::Error> {
92 self.read_register()
93 }
94}
95
96impl<I, R, A> WriteRegister<R, A> for I
97where
98 R: WritableRegister<Address = A>,
99 I: RegisterInterface<R, A>,
100{
101 type Error = I::Error;
102
103 fn write(&mut self, register: R) -> Result<(), Self::Error> {
104 self.write_register(®ister)
105 }
106}
107
108impl<I, R, A> EditRegister<R, A> for I
109where
110 R: EditableRegister<Address = A>,
111 I: RegisterInterface<R, A>,
112{
113 type Error = I::Error;
114
115 fn edit<F>(&mut self, f: F) -> Result<(), Self::Error>
116 where
117 for<'w> F: FnOnce(&'w mut R),
118 {
119 let mut val = self.read_register()?;
120 f(&mut val);
121 self.write_register(&val)
122 }
123}