tauri_plugin_nfc/
models.rs

1// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
2// SPDX-License-Identifier: Apache-2.0
3// SPDX-License-Identifier: MIT
4
5use serde::{Deserialize, Serialize, Serializer};
6use std::fmt::Display;
7
8#[derive(Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct ScanRequest {
11    pub kind: ScanKind,
12    pub keep_session_alive: bool,
13}
14
15#[derive(Serialize)]
16#[serde(rename_all = "camelCase")]
17pub struct NfcRecord {
18    pub format: NFCTypeNameFormat,
19    pub kind: Vec<u8>,
20    pub id: Vec<u8>,
21    pub payload: Vec<u8>,
22}
23
24#[derive(serde_repr::Deserialize_repr, serde_repr::Serialize_repr)]
25#[repr(u8)]
26pub enum NFCTypeNameFormat {
27    Empty = 0,
28    NfcWellKnown = 1,
29    Media = 2,
30    AbsoluteURI = 3,
31    NfcExternal = 4,
32    Unknown = 5,
33    Unchanged = 6,
34}
35
36#[derive(Deserialize)]
37pub struct NfcTagRecord {
38    pub tnf: NFCTypeNameFormat,
39    pub kind: Vec<u8>,
40    pub id: Vec<u8>,
41    pub payload: Vec<u8>,
42}
43
44#[derive(Deserialize)]
45pub struct NfcTag {
46    pub id: String,
47    pub kind: String,
48    pub records: Vec<NfcTagRecord>,
49}
50
51#[derive(Deserialize)]
52pub struct ScanResponse {
53    pub tag: NfcTag,
54}
55
56#[derive(Debug, Default, Serialize)]
57pub struct UriFilter {
58    scheme: Option<String>,
59    host: Option<String>,
60    path_prefix: Option<String>,
61}
62
63#[derive(Debug)]
64pub enum TechKind {
65    IsoDep,
66    MifareClassic,
67    MifareUltralight,
68    Ndef,
69    NdefFormatable,
70    NfcA,
71    NfcB,
72    NfcBarcode,
73    NfcF,
74    NfcV,
75}
76
77impl Display for TechKind {
78    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79        write!(
80            f,
81            "{}",
82            match self {
83                Self::IsoDep => "IsoDep",
84                Self::MifareClassic => "MifareClassic",
85                Self::MifareUltralight => "MifareUltralight",
86                Self::Ndef => "Ndef",
87                Self::NdefFormatable => "NdefFormatable",
88                Self::NfcA => "NfcA",
89                Self::NfcB => "NfcB",
90                Self::NfcBarcode => "NfcBarcode",
91                Self::NfcF => "NfcF",
92                Self::NfcV => "NfcV",
93            }
94        )
95    }
96}
97
98impl Serialize for TechKind {
99    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
100    where
101        S: Serializer,
102    {
103        serializer.serialize_str(&self.to_string())
104    }
105}
106
107#[derive(Debug, Serialize)]
108#[serde(rename_all = "camelCase")]
109pub enum ScanKind {
110    Ndef {
111        mime_type: Option<String>,
112        uri: Option<UriFilter>,
113        tech_list: Option<Vec<Vec<TechKind>>>,
114    },
115    Tag {
116        mime_type: Option<String>,
117        uri: Option<UriFilter>,
118    },
119}