1use cyfs_base::*;
2use serde::{Serialize, Deserialize};
3use cyfs_core::NFTListDesc;
4
5#[derive(RawEncode, RawDecode, Clone, Serialize, Deserialize, Debug, Eq, PartialEq)]
6pub enum NFTState {
7 Normal,
8 Auctioning((u64, CoinTokenId, u64)),
9 Selling((u64, CoinTokenId, u64)),
10}
11
12#[derive(RawEncode, RawDecode, Clone, Debug)]
13pub enum NFTDesc {
14 FileDesc(FileDesc),
15 FileDesc2((FileDesc, Option<ObjectId>)),
16 ListDesc(NFTListDesc)
17}
18
19impl NFTDesc {
20 pub fn nft_id(&self) -> ObjectId {
21 match self {
22 NFTDesc::FileDesc(desc) => {
23 desc.calculate_id()
24 }
25 NFTDesc::ListDesc(desc) => {
26 desc.calculate_id()
27 }
28 NFTDesc::FileDesc2((desc, _)) => {
29 desc.calculate_id()
30 }
31 }
32 }
33
34 pub fn nft_label(&self) -> HashValue {
35 match self {
36 NFTDesc::FileDesc(desc) => {
37 desc.content().hash().clone()
38 }
39 NFTDesc::ListDesc(desc) => {
40 HashValue::try_from(desc.calculate_id().as_slice()).unwrap()
41 }
42 NFTDesc::FileDesc2((desc, _)) => {
43 desc.content().hash().clone()
44 }
45 }
46 }
47
48 pub fn nft_create_time(&self) -> u64 {
49 match self {
50 NFTDesc::FileDesc(desc) => {
51 desc.create_time()
52 }
53 NFTDesc::ListDesc(desc) => {
54 desc.create_time()
55 }
56 NFTDesc::FileDesc2((desc, _)) => {
57 desc.create_time()
58 }
59 }
60 }
61
62 pub fn owner_id(&self) -> &Option<ObjectId> {
63 match self {
64 NFTDesc::FileDesc(desc) => {
65 desc.owner()
66 }
67 NFTDesc::ListDesc(desc) => {
68 desc.owner()
69 }
70 NFTDesc::FileDesc2((desc, _)) => {
71 desc.owner()
72 }
73 }
74 }
75
76 pub fn author_id(&self) -> &Option<ObjectId> {
77 match self {
78 NFTDesc::FileDesc(desc) => {
79 if desc.author().is_some() {
80 desc.author()
81 } else {
82 desc.owner()
83 }
84 }
85 NFTDesc::ListDesc(desc) => {
86 if desc.author().is_some() {
87 desc.author()
88 } else {
89 desc.owner()
90 }
91 }
92 NFTDesc::FileDesc2((desc, _)) => {
93 if desc.author().is_some() {
94 desc.author()
95 } else {
96 desc.owner()
97 }
98 }
99 }
100 }
101
102 pub fn parent_id(&self) -> Option<ObjectId> {
103 match self {
104 NFTDesc::FileDesc(_) => {
105 None
106 }
107 NFTDesc::FileDesc2((_, parent_id)) => {
108 parent_id.clone()
109 }
110 NFTDesc::ListDesc(_) => {
111 None
112 }
113 }
114 }
115
116 pub fn sub_list(&self) -> Option<Vec<ObjectId>> {
117 match self {
118 NFTDesc::FileDesc(_) => {
119 None
120 }
121 NFTDesc::FileDesc2(_) => {
122 None
123 }
124 NFTDesc::ListDesc(sub_list) => {
125 Some(sub_list.content().nft_list.iter().map(|item| item.calculate_id()).collect())
126 }
127 }
128 }
129}
130
131#[derive(RawEncode, RawDecode, Clone, Debug)]
132pub struct NFTCreateTx {
133 pub desc: NFTDesc,
134 pub name: String,
135 pub state: NFTState,
136}
137
138#[derive(RawEncode, RawDecode, Clone, Debug)]
139pub struct NFTCreateTx2 {
140 pub desc: NFTDesc,
141 pub name: String,
142 pub state: NFTState,
143 pub sub_names: Vec<String>,
144 pub sub_states: Vec<NFTState>,
145}
146
147#[derive(RawEncode, RawDecode, Clone, Debug)]
148pub struct NFTAuctionTx {
149 pub nft_id: ObjectId,
150 pub price: u64,
151 pub coin_id: CoinTokenId,
152 pub duration_block_num: u64,
153}
154
155#[derive(RawEncode, RawDecode, Clone, Debug)]
156pub struct NFTBidTx {
157 pub nft_id: ObjectId,
158 pub price: u64,
159 pub coin_id: CoinTokenId,
160}
161
162#[derive(RawEncode, RawDecode, Clone, Debug)]
163pub struct NFTBuyTx {
164 pub nft_id: ObjectId,
165 pub price: u64,
166 pub coin_id: CoinTokenId,
167}
168
169#[derive(RawEncode, RawDecode, Clone, Debug)]
170pub struct NFTSellTx {
171 pub nft_id: ObjectId,
172 pub price: u64,
173 pub coin_id: CoinTokenId,
174 pub duration_block_num: u64,
175}
176
177#[derive(RawEncode, RawDecode, Clone, Debug)]
178pub struct NFTSellTx2 {
179 pub nft_id: ObjectId,
180 pub price: u64,
181 pub coin_id: CoinTokenId,
182 pub sub_sell_infos: Vec<(CoinTokenId, u64)>
183}
184
185#[derive(RawEncode, RawDecode, Clone, Debug)]
186pub struct NFTCancelSellTx {
187 pub nft_id: ObjectId,
188}
189
190#[derive(RawEncode, RawDecode, Clone, Debug)]
192pub struct NFTApplyBuyTx {
193 pub nft_id: ObjectId,
194 pub price: u64,
195 pub coin_id: CoinTokenId,
196}
197
198#[derive(RawEncode, RawDecode, Clone, Debug)]
199pub struct NFTCancelApplyBuyTx {
200 pub nft_id: ObjectId,
201}
202
203#[derive(RawEncode, RawDecode, Clone, Debug)]
204pub struct NFTAgreeApplyTx {
205 pub nft_id: ObjectId,
206 pub user_id: ObjectId,
207}
208
209#[derive(RawEncode, RawDecode, Clone, Debug)]
210pub struct NFTLikeTx {
211 pub nft_id: ObjectId,
212}
213
214#[derive(RawEncode, RawDecode, Clone, Debug)]
215pub struct NFTSetNameTx {
216 pub nft_id: ObjectId,
217 pub name: String,
218}
219
220#[derive(RawEncode, RawDecode, Clone, Debug)]
221pub struct NFTTransTx {
222 pub nft_id: ObjectId,
223 pub to: ObjectId,
224 pub nft_cached: Option<ObjectId>,
225}
226
227#[derive(Serialize, Deserialize)]
228pub struct NFTData {
229 pub nft_id: String,
230 pub create_time: u64,
231 pub beneficiary: String,
232 pub owner_id: String,
233 pub author_id: String,
234 pub name: String,
235 pub reward_amount: i64,
236 pub like_count: i64,
237 pub state: NFTState,
238 pub block_number: i64,
239 pub parent_id: Option<String>,
240 pub sub_list: Option<Vec<String>>,
241 pub price: u64,
242 pub coin_id: CoinTokenId,
243}
244
245#[derive(Serialize, Deserialize)]
246pub struct NFTTransferRecord {
247 pub nft_id: String,
248 pub create_time: u64,
249 pub owner_id: String,
250 pub author_id: String,
251 pub name: String,
252 pub block_number: i64,
253 pub from: String,
254 pub to: String,
255 pub cached: Option<String>,
256}
257
258#[derive(Serialize, Deserialize)]
259pub struct NFTBidRecord {
260 pub buyer_id: String,
261 pub price: u64,
262 pub coin_id: CoinTokenId
263}
264
265pub struct NFTDetail {
266 pub desc: NFTDesc,
267 pub name: String,
268 pub beneficiary: ObjectId,
269 pub state: NFTState,
270 pub like_count: i64,
271 pub block_number: i64,
272 pub price: u64,
273 pub coin_id: CoinTokenId,
274}
275
276pub struct NFTTransRecord {
277 pub desc: NFTDesc,
278 pub name: String,
279 pub block_number: i64,
280 pub from: String,
281 pub to: String,
282 pub nft_cached: Option<String>,
283}