1use crate::{utils, Error, PublicKey, Result};
31use serde::{Deserialize, Serialize};
32use std::{
33 collections::{btree_map::Entry, BTreeMap, BTreeSet},
34 fmt::{self, Debug, Formatter},
35 mem,
36};
37use xor_name::XorName;
38
39#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
42pub struct SeqData {
43 address: Address,
45 data: SeqEntries,
47 permissions: BTreeMap<PublicKey, PermissionSet>,
49 version: u64,
51 owner: PublicKey,
55}
56
57impl Debug for SeqData {
58 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
59 write!(formatter, "SeqMap {:?}", self.name())
60 }
61}
62
63#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
66pub struct UnseqData {
67 address: Address,
69 data: UnseqEntries,
71 permissions: BTreeMap<PublicKey, PermissionSet>,
73 version: u64,
75 owner: PublicKey,
79}
80
81impl Debug for UnseqData {
82 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
83 write!(formatter, "UnseqMap {:?}", self.name())
84 }
85}
86
87#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
89pub struct SeqValue {
90 pub data: Vec<u8>,
92 pub version: u64,
94}
95
96impl Debug for SeqValue {
97 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
98 write!(f, "{:<8} :: {}", hex::encode(&self.data), self.version)
99 }
100}
101
102#[derive(Debug, Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
104pub enum Value {
105 Seq(SeqValue),
107 Unseq(Vec<u8>),
109}
110
111impl From<SeqValue> for Value {
112 fn from(value: SeqValue) -> Self {
113 Value::Seq(value)
114 }
115}
116
117impl From<Vec<u8>> for Value {
118 fn from(value: Vec<u8>) -> Self {
119 Value::Unseq(value)
120 }
121}
122
123#[derive(Debug, Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize)]
125pub enum Values {
126 Seq(Vec<SeqValue>),
128 Unseq(Vec<Vec<u8>>),
130}
131
132impl From<Vec<SeqValue>> for Values {
133 fn from(values: Vec<SeqValue>) -> Self {
134 Values::Seq(values)
135 }
136}
137
138impl From<Vec<Vec<u8>>> for Values {
139 fn from(values: Vec<Vec<u8>>) -> Self {
140 Values::Unseq(values)
141 }
142}
143
144#[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord, Serialize, Deserialize, Default)]
146pub struct PermissionSet {
147 permissions: BTreeSet<Action>,
148}
149
150impl PermissionSet {
151 pub fn new() -> PermissionSet {
153 PermissionSet {
154 permissions: Default::default(),
155 }
156 }
157
158 pub fn allow(mut self, action: Action) -> Self {
160 let _ = self.permissions.insert(action);
161 self
162 }
163
164 pub fn deny(mut self, action: Action) -> Self {
166 let _ = self.permissions.remove(&action);
167 self
168 }
169
170 pub fn is_allowed(&self, action: Action) -> bool {
172 self.permissions.contains(&action)
173 }
174}
175
176#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord, Serialize, Deserialize)]
178pub enum Action {
179 Read,
181 Insert,
183 Update,
185 Delete,
187 ManagePermissions,
189}
190
191macro_rules! impl_map {
192 ($flavour:ident) => {
193 impl $flavour {
194 pub fn address(&self) -> &Address {
196 &self.address
197 }
198
199 pub fn name(&self) -> &XorName {
201 self.address.name()
202 }
203
204 pub fn tag(&self) -> u64 {
206 self.address.tag()
207 }
208
209 pub fn kind(&self) -> Kind {
211 self.address.kind()
212 }
213
214 pub fn version(&self) -> u64 {
216 self.version
217 }
218
219 pub fn owner(&self) -> &PublicKey {
221 &self.owner
222 }
223
224 pub fn keys(&self) -> BTreeSet<Vec<u8>> {
226 self.data.keys().cloned().collect()
227 }
228
229 pub fn shell(&self) -> Self {
231 Self {
232 address: self.address.clone(),
233 data: BTreeMap::new(),
234 permissions: self.permissions.clone(),
235 version: self.version,
236 owner: self.owner,
237 }
238 }
239
240 pub fn permissions(&self) -> BTreeMap<PublicKey, PermissionSet> {
242 self.permissions.clone()
243 }
244
245 pub fn user_permissions(&self, user: &PublicKey) -> Result<&PermissionSet> {
247 self.permissions.get(user).ok_or(Error::NoSuchKey)
248 }
249
250 pub fn check_is_owner(&self, requester: &PublicKey) -> Result<()> {
255 if &self.owner == requester {
256 Ok(())
257 } else {
258 Err(Error::AccessDenied(*requester))
259 }
260 }
261
262 pub fn check_permissions(&self, action: Action, requester: &PublicKey) -> Result<()> {
266 if &self.owner == requester {
267 Ok(())
268 } else {
269 let permissions = self
270 .user_permissions(requester)
271 .map_err(|_| Error::AccessDenied(*requester))?;
272 if permissions.is_allowed(action) {
273 Ok(())
274 } else {
275 Err(Error::AccessDenied(*requester))
276 }
277 }
278 }
279
280 pub fn set_user_permissions(
285 &mut self,
286 user: PublicKey,
287 permissions: PermissionSet,
288 version: u64,
289 ) -> Result<()> {
290 if version != self.version + 1 {
291 return Err(Error::InvalidSuccessor(self.version));
292 }
293
294 let _prev = self.permissions.insert(user, permissions);
295 self.version = version;
296
297 Ok(())
298 }
299
300 pub fn del_user_permissions(&mut self, user: PublicKey, version: u64) -> Result<()> {
305 if version != self.version + 1 {
306 return Err(Error::InvalidSuccessor(self.version));
307 }
308 if !self.permissions.contains_key(&user) {
309 return Err(Error::NoSuchKey);
310 }
311
312 let _ = self.permissions.remove(&user);
313 self.version = version;
314
315 Ok(())
316 }
317
318 pub fn del_user_permissions_without_validation(
323 &mut self,
324 user: PublicKey,
325 version: u64,
326 ) -> bool {
327 if version <= self.version {
328 return false;
329 }
330
331 let _ = self.permissions.remove(&user);
332 self.version = version;
333
334 true
335 }
336
337 pub fn change_owner(&mut self, new_owner: PublicKey, version: u64) -> Result<()> {
342 if version != self.version + 1 {
343 return Err(Error::InvalidSuccessor(self.version));
344 }
345
346 self.owner = new_owner;
347 self.version = version;
348
349 Ok(())
350 }
351
352 pub fn change_owner_without_validation(
357 &mut self,
358 new_owner: PublicKey,
359 version: u64,
360 ) -> bool {
361 if version <= self.version {
362 return false;
363 }
364
365 self.owner = new_owner;
366 self.version = version;
367
368 true
369 }
370
371 pub fn is_action_allowed(&self, requester: &PublicKey, action: Action) -> bool {
373 match self.permissions.get(requester) {
374 Some(perms) => perms.is_allowed(action),
375 None => false,
376 }
377 }
378 }
379 };
380}
381
382impl_map!(SeqData);
383impl_map!(UnseqData);
384
385impl UnseqData {
386 pub fn new(name: XorName, tag: u64, owner: PublicKey) -> Self {
388 Self {
389 address: Address::Unseq { name, tag },
390 data: Default::default(),
391 permissions: Default::default(),
392 version: 0,
393 owner,
394 }
395 }
396
397 pub fn new_with_data(
399 name: XorName,
400 tag: u64,
401 data: UnseqEntries,
402 permissions: BTreeMap<PublicKey, PermissionSet>,
403 owner: PublicKey,
404 ) -> Self {
405 Self {
406 address: Address::Unseq { name, tag },
407 data,
408 permissions,
409 version: 0,
410 owner,
411 }
412 }
413
414 pub fn get(&self, key: &[u8]) -> Option<&Vec<u8>> {
416 self.data.get(key)
417 }
418
419 pub fn values(&self) -> Vec<Vec<u8>> {
421 self.data.values().cloned().collect()
422 }
423
424 pub fn entries(&self) -> &UnseqEntries {
426 &self.data
427 }
428
429 pub fn take_entries(&mut self) -> UnseqEntries {
431 mem::replace(&mut self.data, BTreeMap::new())
432 }
433
434 pub fn mutate_entries(
438 &mut self,
439 actions: UnseqEntryActions,
440 requester: &PublicKey,
441 ) -> Result<()> {
442 let (insert, update, delete) = actions.actions.into_iter().fold(
443 (
444 BTreeMap::<Vec<u8>, Vec<u8>>::new(),
445 BTreeMap::<Vec<u8>, Vec<u8>>::new(),
446 BTreeSet::<Vec<u8>>::new(),
447 ),
448 |(mut insert, mut update, mut delete), (key, item)| {
449 match item {
450 UnseqEntryAction::Ins(value) => {
451 let _ = insert.insert(key, value);
452 }
453 UnseqEntryAction::Update(value) => {
454 let _ = update.insert(key, value);
455 }
456 UnseqEntryAction::Del => {
457 let _ = delete.insert(key);
458 }
459 };
460 (insert, update, delete)
461 },
462 );
463
464 if self.owner() != requester
465 && ((!insert.is_empty() && !self.is_action_allowed(requester, Action::Insert))
466 || (!update.is_empty() && !self.is_action_allowed(requester, Action::Update))
467 || (!delete.is_empty() && !self.is_action_allowed(requester, Action::Delete)))
468 {
469 return Err(Error::AccessDenied(*requester));
470 }
471
472 let mut new_data = self.data.clone();
473 let mut errors = BTreeMap::new();
474
475 for (key, val) in insert {
476 match new_data.entry(key) {
477 Entry::Occupied(entry) => {
478 let _ = errors.insert(entry.key().clone(), Error::EntryExists(0));
479 }
480 Entry::Vacant(entry) => {
481 let _ = entry.insert(val);
482 }
483 }
484 }
485
486 for (key, val) in update {
487 match new_data.entry(key) {
488 Entry::Occupied(mut entry) => {
489 let _ = entry.insert(val);
490 }
491 Entry::Vacant(entry) => {
492 let _ = errors.insert(entry.key().clone(), Error::NoSuchEntry);
493 }
494 }
495 }
496
497 for key in delete {
498 match new_data.entry(key.clone()) {
499 Entry::Occupied(_) => {
500 let _ = new_data.remove(&key);
501 }
502 Entry::Vacant(entry) => {
503 let _ = errors.insert(entry.key().clone(), Error::NoSuchEntry);
504 }
505 }
506 }
507
508 if !errors.is_empty() {
509 return Err(Error::InvalidEntryActions(errors));
510 }
511
512 let _old_data = mem::replace(&mut self.data, new_data);
513
514 Ok(())
515 }
516}
517
518impl SeqData {
520 pub fn new(name: XorName, tag: u64, owner: PublicKey) -> Self {
522 Self {
523 address: Address::Seq { name, tag },
524 data: Default::default(),
525 permissions: Default::default(),
526 version: 0,
527 owner,
528 }
529 }
530
531 pub fn new_with_data(
533 name: XorName,
534 tag: u64,
535 data: SeqEntries,
536 permissions: BTreeMap<PublicKey, PermissionSet>,
537 owner: PublicKey,
538 ) -> Self {
539 Self {
540 address: Address::Seq { name, tag },
541 data,
542 permissions,
543 version: 0,
544 owner,
545 }
546 }
547
548 pub fn get(&self, key: &[u8]) -> Option<&SeqValue> {
550 self.data.get(key)
551 }
552
553 pub fn values(&self) -> Vec<SeqValue> {
555 self.data.values().cloned().collect()
556 }
557
558 pub fn entries(&self) -> &SeqEntries {
560 &self.data
561 }
562
563 pub fn take_entries(&mut self) -> SeqEntries {
565 mem::replace(&mut self.data, BTreeMap::new())
566 }
567
568 pub fn mutate_entries(
572 &mut self,
573 actions: SeqEntryActions,
574 requester: &PublicKey,
575 ) -> Result<()> {
576 let (insert, update, delete) = actions.actions.into_iter().fold(
578 (BTreeMap::new(), BTreeMap::new(), BTreeMap::new()),
579 |(mut insert, mut update, mut delete), (key, item)| {
580 match item {
581 SeqEntryAction::Ins(value) => {
582 let _ = insert.insert(key, value);
583 }
584 SeqEntryAction::Update(value) => {
585 let _ = update.insert(key, value);
586 }
587 SeqEntryAction::Del(version) => {
588 let _ = delete.insert(key, version);
589 }
590 };
591 (insert, update, delete)
592 },
593 );
594
595 if self.owner() != requester
596 && ((!insert.is_empty() && !self.is_action_allowed(requester, Action::Insert))
597 || (!update.is_empty() && !self.is_action_allowed(requester, Action::Update))
598 || (!delete.is_empty() && !self.is_action_allowed(requester, Action::Delete)))
599 {
600 return Err(Error::AccessDenied(*requester));
601 }
602
603 let mut new_data = self.data.clone();
604 let mut errors = BTreeMap::new();
605
606 for (key, val) in insert {
607 match new_data.entry(key) {
608 Entry::Occupied(entry) => {
609 let _ = errors.insert(
610 entry.key().clone(),
611 Error::EntryExists(entry.get().version as u8),
612 );
613 }
614 Entry::Vacant(entry) => {
615 let _ = entry.insert(val);
616 }
617 }
618 }
619
620 for (key, val) in update {
621 match new_data.entry(key) {
622 Entry::Occupied(mut entry) => {
623 let current_version = entry.get().version;
624 if val.version == current_version + 1 {
625 let _ = entry.insert(val);
626 } else {
627 let _ = errors.insert(
628 entry.key().clone(),
629 Error::InvalidSuccessor(current_version),
630 );
631 }
632 }
633 Entry::Vacant(entry) => {
634 let _ = errors.insert(entry.key().clone(), Error::NoSuchEntry);
635 }
636 }
637 }
638
639 for (key, version) in delete {
640 match new_data.entry(key.clone()) {
641 Entry::Occupied(entry) => {
642 let current_version = entry.get().version;
643 if version == current_version + 1 {
644 let _ = new_data.remove(&key);
645 } else {
646 let _ = errors.insert(
647 entry.key().clone(),
648 Error::InvalidSuccessor(current_version),
649 );
650 }
651 }
652 Entry::Vacant(entry) => {
653 let _ = errors.insert(entry.key().clone(), Error::NoSuchEntry);
654 }
655 }
656 }
657
658 if !errors.is_empty() {
659 return Err(Error::InvalidEntryActions(errors));
660 }
661
662 let _old_data = mem::replace(&mut self.data, new_data);
663
664 Ok(())
665 }
666}
667
668#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, Debug)]
670pub enum Kind {
671 Unseq,
673 Seq,
675}
676
677impl Kind {
678 pub fn from_flag(sequenced: bool) -> Self {
680 if sequenced {
681 Kind::Seq
682 } else {
683 Kind::Unseq
684 }
685 }
686
687 pub fn is_seq(self) -> bool {
689 self == Kind::Seq
690 }
691
692 pub fn is_unseq(self) -> bool {
694 !self.is_seq()
695 }
696}
697
698#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, Debug)]
700pub enum Address {
701 Unseq {
703 name: XorName,
705 tag: u64,
707 },
708 Seq {
710 name: XorName,
712 tag: u64,
714 },
715}
716
717impl Address {
718 pub fn from_kind(kind: Kind, name: XorName, tag: u64) -> Self {
720 match kind {
721 Kind::Seq => Address::Seq { name, tag },
722 Kind::Unseq => Address::Unseq { name, tag },
723 }
724 }
725
726 pub fn kind(&self) -> Kind {
728 match self {
729 Address::Seq { .. } => Kind::Seq,
730 Address::Unseq { .. } => Kind::Unseq,
731 }
732 }
733
734 pub fn name(&self) -> &XorName {
736 match self {
737 Address::Unseq { ref name, .. } | Address::Seq { ref name, .. } => name,
738 }
739 }
740
741 pub fn tag(&self) -> u64 {
743 match self {
744 Address::Unseq { tag, .. } | Address::Seq { tag, .. } => *tag,
745 }
746 }
747
748 pub fn is_seq(&self) -> bool {
750 self.kind().is_seq()
751 }
752
753 pub fn is_unseq(&self) -> bool {
755 self.kind().is_unseq()
756 }
757
758 pub fn encode_to_zbase32(&self) -> Result<String> {
760 utils::encode(&self)
761 }
762
763 pub fn decode_from_zbase32<T: AsRef<str>>(encoded: T) -> Result<Self> {
765 utils::decode(encoded)
766 }
767}
768
769#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, Debug)]
771pub enum Data {
772 Seq(SeqData),
774 Unseq(UnseqData),
776}
777
778impl Data {
779 pub fn address(&self) -> &Address {
781 match self {
782 Data::Seq(data) => data.address(),
783 Data::Unseq(data) => data.address(),
784 }
785 }
786
787 pub fn kind(&self) -> Kind {
789 self.address().kind()
790 }
791
792 pub fn name(&self) -> &XorName {
794 self.address().name()
795 }
796
797 pub fn tag(&self) -> u64 {
799 self.address().tag()
800 }
801
802 pub fn is_seq(&self) -> bool {
804 self.kind().is_seq()
805 }
806
807 pub fn is_unseq(&self) -> bool {
809 self.kind().is_unseq()
810 }
811
812 pub fn version(&self) -> u64 {
814 match self {
815 Data::Seq(data) => data.version(),
816 Data::Unseq(data) => data.version(),
817 }
818 }
819
820 pub fn keys(&self) -> BTreeSet<Vec<u8>> {
822 match self {
823 Data::Seq(data) => data.keys(),
824 Data::Unseq(data) => data.keys(),
825 }
826 }
827
828 pub fn shell(&self) -> Self {
830 match self {
831 Data::Seq(data) => Data::Seq(data.shell()),
832 Data::Unseq(data) => Data::Unseq(data.shell()),
833 }
834 }
835
836 pub fn permissions(&self) -> BTreeMap<PublicKey, PermissionSet> {
838 match self {
839 Data::Seq(data) => data.permissions(),
840 Data::Unseq(data) => data.permissions(),
841 }
842 }
843
844 pub fn user_permissions(&self, user: &PublicKey) -> Result<&PermissionSet> {
846 match self {
847 Data::Seq(data) => data.user_permissions(user),
848 Data::Unseq(data) => data.user_permissions(user),
849 }
850 }
851
852 pub fn set_user_permissions(
854 &mut self,
855 user: PublicKey,
856 permissions: PermissionSet,
857 version: u64,
858 ) -> Result<()> {
859 match self {
860 Data::Seq(data) => data.set_user_permissions(user, permissions, version),
861 Data::Unseq(data) => data.set_user_permissions(user, permissions, version),
862 }
863 }
864
865 pub fn del_user_permissions(&mut self, user: PublicKey, version: u64) -> Result<()> {
867 match self {
868 Data::Seq(data) => data.del_user_permissions(user, version),
869 Data::Unseq(data) => data.del_user_permissions(user, version),
870 }
871 }
872
873 pub fn check_permissions(&self, action: Action, requester: &PublicKey) -> Result<()> {
875 match self {
876 Data::Seq(data) => data.check_permissions(action, requester),
877 Data::Unseq(data) => data.check_permissions(action, requester),
878 }
879 }
880
881 pub fn check_is_owner(&self, requester: &PublicKey) -> Result<()> {
883 match self {
884 Data::Seq(data) => data.check_is_owner(requester),
885 Data::Unseq(data) => data.check_is_owner(requester),
886 }
887 }
888
889 pub fn owner(&self) -> PublicKey {
891 match self {
892 Data::Seq(data) => data.owner,
893 Data::Unseq(data) => data.owner,
894 }
895 }
896
897 pub fn mutate_entries(&mut self, actions: EntryActions, requester: &PublicKey) -> Result<()> {
899 match self {
900 Data::Seq(data) => {
901 if let EntryActions::Seq(actions) = actions {
902 return data.mutate_entries(actions, requester);
903 }
904 }
905 Data::Unseq(data) => {
906 if let EntryActions::Unseq(actions) = actions {
907 return data.mutate_entries(actions, requester);
908 }
909 }
910 }
911
912 Err(Error::InvalidOperation)
913 }
914}
915
916impl From<SeqData> for Data {
917 fn from(data: SeqData) -> Self {
918 Data::Seq(data)
919 }
920}
921
922impl From<UnseqData> for Data {
923 fn from(data: UnseqData) -> Self {
924 Data::Unseq(data)
925 }
926}
927
928#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize, Debug)]
930pub enum SeqEntryAction {
931 Ins(SeqValue),
933 Update(SeqValue),
935 Del(u64),
937}
938
939impl SeqEntryAction {
940 pub fn version(&self) -> u64 {
942 match *self {
943 Self::Ins(ref value) => value.version,
944 Self::Update(ref value) => value.version,
945 Self::Del(v) => v,
946 }
947 }
948
949 pub fn set_version(&mut self, version: u64) {
951 match *self {
952 Self::Ins(ref mut value) => value.version = version,
953 Self::Update(ref mut value) => value.version = version,
954 Self::Del(ref mut v) => *v = version,
955 }
956 }
957}
958
959#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize, Debug)]
961pub enum UnseqEntryAction {
962 Ins(Vec<u8>),
964 Update(Vec<u8>),
966 Del,
968}
969
970#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize, Debug, Default)]
972pub struct SeqEntryActions {
973 actions: BTreeMap<Vec<u8>, SeqEntryAction>,
975}
976
977impl SeqEntryActions {
978 pub fn new() -> Self {
980 Default::default()
981 }
982
983 pub fn actions(&self) -> &BTreeMap<Vec<u8>, SeqEntryAction> {
985 &self.actions
986 }
987
988 pub fn into_actions(self) -> BTreeMap<Vec<u8>, SeqEntryAction> {
990 self.actions
991 }
992
993 pub fn ins(mut self, key: Vec<u8>, content: Vec<u8>, version: u64) -> Self {
998 let _ = self.actions.insert(
999 key,
1000 SeqEntryAction::Ins(SeqValue {
1001 data: content,
1002 version,
1003 }),
1004 );
1005 self
1006 }
1007
1008 pub fn update(mut self, key: Vec<u8>, content: Vec<u8>, version: u64) -> Self {
1013 let _ = self.actions.insert(
1014 key,
1015 SeqEntryAction::Update(SeqValue {
1016 data: content,
1017 version,
1018 }),
1019 );
1020 self
1021 }
1022
1023 pub fn del(mut self, key: Vec<u8>, version: u64) -> Self {
1028 let _ = self.actions.insert(key, SeqEntryAction::Del(version));
1029 self
1030 }
1031
1032 pub fn add_action(&mut self, key: Vec<u8>, action: SeqEntryAction) {
1034 let _ = self.actions.insert(key, action);
1035 }
1036}
1037
1038impl From<SeqEntryActions> for BTreeMap<Vec<u8>, SeqEntryAction> {
1039 fn from(actions: SeqEntryActions) -> Self {
1040 actions.actions
1041 }
1042}
1043
1044impl From<BTreeMap<Vec<u8>, SeqEntryAction>> for SeqEntryActions {
1045 fn from(actions: BTreeMap<Vec<u8>, SeqEntryAction>) -> Self {
1046 SeqEntryActions { actions }
1047 }
1048}
1049
1050#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize, Debug, Default)]
1052pub struct UnseqEntryActions {
1053 actions: BTreeMap<Vec<u8>, UnseqEntryAction>,
1056}
1057
1058impl UnseqEntryActions {
1059 pub fn new() -> Self {
1061 Default::default()
1062 }
1063
1064 pub fn actions(&self) -> &BTreeMap<Vec<u8>, UnseqEntryAction> {
1066 &self.actions
1067 }
1068
1069 pub fn into_actions(self) -> BTreeMap<Vec<u8>, UnseqEntryAction> {
1071 self.actions
1072 }
1073
1074 pub fn ins(mut self, key: Vec<u8>, content: Vec<u8>) -> Self {
1076 let _ = self.actions.insert(key, UnseqEntryAction::Ins(content));
1077 self
1078 }
1079
1080 pub fn update(mut self, key: Vec<u8>, content: Vec<u8>) -> Self {
1082 let _ = self.actions.insert(key, UnseqEntryAction::Update(content));
1083 self
1084 }
1085
1086 pub fn del(mut self, key: Vec<u8>) -> Self {
1088 let _ = self.actions.insert(key, UnseqEntryAction::Del);
1089 self
1090 }
1091
1092 pub fn add_action(&mut self, key: Vec<u8>, action: UnseqEntryAction) {
1094 let _ = self.actions.insert(key, action);
1095 }
1096}
1097
1098impl From<UnseqEntryActions> for BTreeMap<Vec<u8>, UnseqEntryAction> {
1099 fn from(actions: UnseqEntryActions) -> Self {
1100 actions.actions
1101 }
1102}
1103
1104impl From<BTreeMap<Vec<u8>, UnseqEntryAction>> for UnseqEntryActions {
1105 fn from(actions: BTreeMap<Vec<u8>, UnseqEntryAction>) -> Self {
1106 UnseqEntryActions { actions }
1107 }
1108}
1109
1110#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize, Debug)]
1112pub enum EntryActions {
1113 Seq(SeqEntryActions),
1115 Unseq(UnseqEntryActions),
1117}
1118
1119impl EntryActions {
1120 pub fn kind(&self) -> Kind {
1122 match self {
1123 EntryActions::Seq(_) => Kind::Seq,
1124 EntryActions::Unseq(_) => Kind::Unseq,
1125 }
1126 }
1127}
1128
1129impl From<SeqEntryActions> for EntryActions {
1130 fn from(entry_actions: SeqEntryActions) -> Self {
1131 EntryActions::Seq(entry_actions)
1132 }
1133}
1134
1135impl From<UnseqEntryActions> for EntryActions {
1136 fn from(entry_actions: UnseqEntryActions) -> Self {
1137 EntryActions::Unseq(entry_actions)
1138 }
1139}
1140
1141pub type SeqEntries = BTreeMap<Vec<u8>, SeqValue>;
1143pub type UnseqEntries = BTreeMap<Vec<u8>, Vec<u8>>;
1145
1146#[derive(Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Serialize, Deserialize, Debug)]
1148pub enum Entries {
1149 Seq(SeqEntries),
1151 Unseq(UnseqEntries),
1153}
1154
1155impl From<SeqEntries> for Entries {
1156 fn from(entries: SeqEntries) -> Self {
1157 Entries::Seq(entries)
1158 }
1159}
1160
1161impl From<UnseqEntries> for Entries {
1162 fn from(entries: UnseqEntries) -> Self {
1163 Entries::Unseq(entries)
1164 }
1165}
1166
1167#[cfg(test)]
1168mod tests {
1169 use super::{Address, XorName};
1170 use crate::Result;
1171
1172 #[test]
1173 fn zbase32_encode_decode_map_address() -> Result<()> {
1174 let name = XorName(rand::random());
1175 let address = Address::Seq { name, tag: 15000 };
1176 let encoded = address.encode_to_zbase32()?;
1177 let decoded = self::Address::decode_from_zbase32(&encoded)?;
1178 assert_eq!(address, decoded);
1179 Ok(())
1180 }
1181}