1
+ use urid:: { URIDCollection , Map } ;
2
+ use crate :: request:: OptionRequestList ;
3
+ use crate :: { OptionsError , OptionValue } ;
4
+ use crate :: list:: OptionsList ;
5
+ use crate :: option:: request:: OptionRequest ;
6
+
7
+ pub trait OptionsCollection : Sized {
8
+ type Serializer ;
9
+
10
+ #[ inline]
11
+ fn new_serializer < ' a , M : Map + ?Sized > ( map : & M ) -> Option < OptionsSerializer < Self > >
12
+ where Self :: Serializer : OptionsSerializationContext < ' a , Self > { // FIXME
13
+ Some ( OptionsSerializer { inner : Self :: Serializer :: from_map ( map) ? } )
14
+ }
15
+ }
16
+
17
+ #[ doc( hidden) ]
18
+ pub mod implementation {
19
+ use crate :: { OptionType , OptionsError , OptionValue } ;
20
+ use std:: marker:: PhantomData ;
21
+ use urid:: { URID , URIDCollection , Map } ;
22
+ use crate :: collection:: { OptionsSerializationContext , OptionsCollection } ;
23
+ use crate :: option:: request:: OptionRequest ;
24
+ use lv2_atom:: { Atom , BackAsSpace } ;
25
+ use lv2_atom:: scalar:: ScalarAtom ;
26
+
27
+ pub struct OptionTypeSerializationContext < O : OptionType > {
28
+ option_urid : URID < O > ,
29
+ option_type_atom_urid : URID < O :: AtomType >
30
+ }
31
+
32
+ impl < ' a , O : OptionType > OptionsCollection for O
33
+ where <O as OptionType >:: AtomType : BackAsSpace < ' a > ,
34
+ <<O as OptionType >:: AtomType as Atom < ' a , ' a > >:: ReadParameter : Default {
35
+ type Serializer = OptionTypeSerializationContext < O > ;
36
+ }
37
+
38
+ impl < O : OptionType > URIDCollection for OptionTypeSerializationContext < O > {
39
+ #[ inline]
40
+ fn from_map < M : Map + ?Sized > ( map : & M ) -> Option < Self > {
41
+ Some ( Self {
42
+ option_urid : map. populate_collection ( ) ?,
43
+ option_type_atom_urid : map. populate_collection ( ) ?,
44
+ } )
45
+ }
46
+ }
47
+
48
+ impl < ' a , O : OptionType > OptionsSerializationContext < ' a , O > for OptionTypeSerializationContext < O >
49
+ where <O as OptionType >:: AtomType : BackAsSpace < ' a > ,
50
+ <<O as OptionType >:: AtomType as Atom < ' a , ' a > >:: ReadParameter : Default {
51
+ #[ inline]
52
+ fn deserialize_new ( & self , option : & ' a OptionValue ) -> Option < O > {
53
+ option. read ( self . option_urid , self . option_type_atom_urid , Default :: default ( ) )
54
+ }
55
+
56
+ fn deserialize_to ( & self , options : & mut O , option : & OptionValue ) -> Result < ( ) , OptionsError > {
57
+ todo ! ( )
58
+ }
59
+
60
+ fn respond_to_request < ' r > ( & self , options : & ' r O , requests : & ' r mut OptionRequest ) -> Result < ( ) , OptionsError > {
61
+ todo ! ( )
62
+ }
63
+ }
64
+ }
65
+
66
+ pub struct OptionsSerializer < T : OptionsCollection > {
67
+ inner : T :: Serializer
68
+ }
69
+
70
+ impl < T : OptionsCollection > OptionsSerializer < T > {
71
+ pub fn deserialize_new ( & self , list : & OptionsList ) -> Option < T > {
72
+ todo ! ( )
73
+ }
74
+
75
+ pub fn deserialize_to ( & self , options : & mut T , list : & OptionsList ) -> Result < ( ) , OptionsError > {
76
+ todo ! ( )
77
+ }
78
+
79
+ pub fn respond_to_requests < ' a > ( & self , options : & T , requests : & mut OptionRequestList ) -> Result < ( ) , OptionsError > {
80
+ todo ! ( )
81
+ }
82
+ }
83
+
84
+ pub trait OptionsSerializationContext < ' a , T : OptionsCollection > : URIDCollection {
85
+ fn deserialize_new ( & self , option : & ' a OptionValue ) -> Option < T > ;
86
+
87
+ fn deserialize_to ( & self , options : & mut T , option : & OptionValue ) -> Result < ( ) , OptionsError > ;
88
+
89
+ fn respond_to_request < ' r > ( & self , options : & ' r T , request : & ' r mut OptionRequest ) -> Result < ( ) , OptionsError > ;
90
+ }
0 commit comments