]> git.sesse.net Git - bcachefs-tools-debian/blob - rust-src/bch_bindgen/src/bkey.rs
remove library from bcachefs-tools Rust package
[bcachefs-tools-debian] / rust-src / bch_bindgen / src / bkey.rs
1 #![allow(non_camel_case_types)]
2
3 use crate::c;
4 use crate::fs::Fs;
5 use crate::btree::BtreeIter;
6 use crate::printbuf_to_formatter;
7 use std::fmt;
8 use std::marker::PhantomData;
9 use std::mem::transmute;
10
11 pub struct BkeySC<'a> {
12     pub k:              &'a c::bkey,
13     pub v:              &'a c::bch_val,
14     pub(crate) iter:    PhantomData<&'a mut BtreeIter<'a>>
15 }
16
17 pub enum BkeyValC<'a> {
18     deleted,
19     whiteout,
20     error,
21     cookie(&'a c::bch_cookie),
22     hash_whiteout(&'a c::bch_hash_whiteout),
23     btree_ptr(&'a c::bch_btree_ptr),
24     extent(&'a c::bch_extent),
25     reservation(&'a c::bch_reservation),
26     inode(&'a c::bch_inode),
27     inode_generation(&'a c::bch_inode_generation),
28     dirent(&'a c::bch_dirent),
29     xattr(&'a c::bch_xattr),
30     alloc(&'a c::bch_alloc),
31     quota(&'a c::bch_quota),
32     stripe(&'a c::bch_stripe),
33     reflink_p(&'a c::bch_reflink_p),
34     reflink_v(&'a c::bch_reflink_v),
35     inline_data(&'a c::bch_inline_data),
36     btree_ptr_v2(&'a c::bch_btree_ptr_v2),
37     indirect_inline_data(&'a c::bch_indirect_inline_data),
38     alloc_v2(&'a c::bch_alloc_v2),
39     subvolume(&'a c::bch_subvolume),
40     snapshot(&'a c::bch_snapshot),
41     inode_v2(&'a c::bch_inode_v2),
42     alloc_v3(&'a c::bch_alloc_v3),
43     set,
44     lru(&'a c::bch_lru),
45     alloc_v4(&'a c::bch_alloc_v4),
46     backpointer(&'a c::bch_backpointer),
47     inode_v3(&'a c::bch_inode_v3),
48     bucket_gens(&'a c::bch_bucket_gens),
49     snapshot_tree(&'a c::bch_snapshot_tree),
50     logged_op_truncate(&'a c::bch_logged_op_truncate),
51     logged_op_finsert(&'a c::bch_logged_op_finsert),
52 }
53
54 impl<'a, 'b> BkeySC<'a> {
55     unsafe fn to_raw(&self) -> c::bkey_s_c {
56         c::bkey_s_c { k: self.k, v: self.v }
57     }
58
59     pub fn to_text(&'a self, fs: &'b Fs) -> BkeySCToText<'a, 'b> {
60         BkeySCToText { k: self, fs }
61     }
62
63     pub fn v(&'a self) -> BkeyValC {
64         let ty: c::bch_bkey_type = unsafe { transmute(self.k.type_ as u32) };
65
66         use c::bch_bkey_type::*;
67         use BkeyValC::*;
68         match ty {
69             KEY_TYPE_deleted                => deleted,
70             KEY_TYPE_whiteout               => whiteout,
71             KEY_TYPE_error                  => error,
72             KEY_TYPE_cookie                 => cookie(unsafe { transmute(self.v) }),
73             KEY_TYPE_hash_whiteout          => hash_whiteout(unsafe { transmute(self.v) }),
74             KEY_TYPE_btree_ptr              => btree_ptr(unsafe { transmute(self.v) }),
75             KEY_TYPE_extent                 => extent(unsafe { transmute(self.v) }),
76             KEY_TYPE_reservation            => reservation(unsafe { transmute(self.v) }),
77             KEY_TYPE_inode                  => inode(unsafe { transmute(self.v) }),
78             KEY_TYPE_inode_generation       => inode_generation(unsafe { transmute(self.v) }),
79             KEY_TYPE_dirent                 => dirent(unsafe { transmute(self.v) }),
80             KEY_TYPE_xattr                  => xattr(unsafe { transmute(self.v) }),
81             KEY_TYPE_alloc                  => alloc(unsafe { transmute(self.v) }),
82             KEY_TYPE_quota                  => quota(unsafe { transmute(self.v) }),
83             KEY_TYPE_stripe                 => stripe(unsafe { transmute(self.v) }),
84             KEY_TYPE_reflink_p              => reflink_p(unsafe { transmute(self.v) }),
85             KEY_TYPE_reflink_v              => reflink_v(unsafe { transmute(self.v) }),
86             KEY_TYPE_inline_data            => inline_data(unsafe { transmute(self.v) }),
87             KEY_TYPE_btree_ptr_v2           => btree_ptr_v2(unsafe { transmute(self.v) }),
88             KEY_TYPE_indirect_inline_data   => indirect_inline_data(unsafe { transmute(self.v) }),
89             KEY_TYPE_alloc_v2               => alloc_v2(unsafe { transmute(self.v) }),
90             KEY_TYPE_subvolume              => subvolume(unsafe { transmute(self.v) }),
91             KEY_TYPE_snapshot               => snapshot(unsafe { transmute(self.v) }),
92             KEY_TYPE_inode_v2               => inode_v2(unsafe { transmute(self.v) }),
93             KEY_TYPE_alloc_v3               => inode_v3(unsafe { transmute(self.v) }),
94             KEY_TYPE_set                    => set,
95             KEY_TYPE_lru                    => lru(unsafe { transmute(self.v) }),
96             KEY_TYPE_alloc_v4               => alloc_v4(unsafe { transmute(self.v) }),
97             KEY_TYPE_backpointer            => backpointer(unsafe { transmute(self.v) }),
98             KEY_TYPE_inode_v3               => inode_v3(unsafe { transmute(self.v) }),
99             KEY_TYPE_bucket_gens            => bucket_gens(unsafe { transmute(self.v) }),
100             KEY_TYPE_snapshot_tree          => snapshot_tree(unsafe { transmute(self.v) }),
101             KEY_TYPE_logged_op_truncate     => logged_op_truncate(unsafe { transmute(self.v) }),
102             KEY_TYPE_logged_op_finsert      => logged_op_finsert(unsafe { transmute(self.v) }),
103             KEY_TYPE_MAX                    => unreachable!(),
104         }
105     }
106 }
107
108 impl<'a> From<&'a c::bkey_i> for BkeySC<'a> {
109     fn from(k: &'a c::bkey_i) -> Self {
110         BkeySC { k: &k.k, v: &k.v, iter: PhantomData }
111     }
112 }
113
114 pub struct BkeySCToText<'a, 'b> {
115     k:  &'a BkeySC<'a>,
116     fs: &'b Fs,
117 }
118
119 impl<'a, 'b> fmt::Display for BkeySCToText<'a, 'b> {
120     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
121         unsafe {
122             printbuf_to_formatter(f, |buf| c::bch2_bkey_val_to_text(buf, self.fs.raw, self.k.to_raw())) 
123         }
124     }
125 }