device_register_async/
lib.rs1#![doc = include_str!("../README.md")]
2#![no_std]
3#![deny(unsafe_code, missing_docs)]
4#![allow(async_fn_in_trait)]
5
6pub use device_register;
7use device_register::{EditableRegister, ReadableRegister, Register, WritableRegister};
8
9pub trait RegisterInterface<R, A>
12where
13 R: Register<Address = A>,
14{
15 type Error;
17
18 async fn read_register(&mut self) -> Result<R, Self::Error>;
20
21 async fn write_register(&mut self, register: &R) -> Result<(), Self::Error>;
23}
24
25pub trait ReadRegister<R, A>
27where
28 R: ReadableRegister<Address = A>,
29{
30 type Error;
32
33 async fn read(&mut self) -> Result<R, Self::Error>;
35}
36
37pub trait WriteRegister<R, A>
39where
40 R: WritableRegister<Address = A>,
41{
42 type Error;
44
45 async fn write(&mut self, register: R) -> Result<(), Self::Error>;
47}
48
49pub trait EditRegister<R, A>
53where
54 for<'a> R: EditableRegister<Address = A> + 'a,
55{
56 type Error;
58
59 async fn edit<F>(&mut self, f: F) -> Result<(), Self::Error>
62 where
63 for<'w> F: FnOnce(&'w mut R);
64}
65
66impl<I, R, A> ReadRegister<R, A> for I
67where
68 for<'a> R: ReadableRegister<Address = A> + 'a,
69 I: RegisterInterface<R, A>,
70 for<'a> A: 'a,
71{
72 type Error = I::Error;
73
74 async fn read(&mut self) -> Result<R, Self::Error> {
75 self.read_register().await
76 }
77}
78
79impl<I, R, A> WriteRegister<R, A> for I
80where
81 for<'a> R: WritableRegister<Address = A> + 'a,
82 I: RegisterInterface<R, A>,
83 for<'a> A: 'a,
84{
85 type Error = I::Error;
86
87 async fn write(&mut self, register: R) -> Result<(), Self::Error> {
88 self.write_register(®ister).await
89 }
90}
91
92impl<I, R, A> EditRegister<R, A> for I
93where
94 for<'a> R: EditableRegister<Address = A> + 'a,
95 I: RegisterInterface<R, A>,
96 for<'a> A: 'a,
97{
98 type Error = I::Error;
99
100 async fn edit<F>(&mut self, f: F) -> Result<(), Self::Error>
101 where
102 for<'w> F: FnOnce(&'w mut R),
103 {
104 let mut val = self.read_register().await?;
105 f(&mut val);
106 self.write_register(&val).await
107 }
108}