1#![no_std]
5#![warn(non_ascii_idents, trivial_casts, unused, unused_qualifications)]
6#![deny(unsafe_code)]
7
8use serde::{Deserialize, Serialize};
9use trussed_core::{
10 serde_extensions::{Extension, ExtensionClient, ExtensionResult},
11 types::Location,
12 Error,
13};
14
15pub struct FsInfoExtension;
16
17#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
18pub enum FsInfoExtensionRequest {
19 FsInfo(FsInfoRequest),
20}
21
22#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
23pub struct FsInfoRequest {
24 pub location: Location,
25}
26
27impl From<FsInfoRequest> for FsInfoExtensionRequest {
28 fn from(value: FsInfoRequest) -> Self {
29 Self::FsInfo(value)
30 }
31}
32
33impl TryFrom<FsInfoExtensionRequest> for FsInfoRequest {
34 type Error = Error;
35
36 fn try_from(value: FsInfoExtensionRequest) -> Result<Self, Self::Error> {
37 match value {
38 FsInfoExtensionRequest::FsInfo(v) => Ok(v),
39 }
40 }
41}
42
43#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
44pub enum FsInfoExtensionReply {
45 FsInfo(FsInfoReply),
46}
47
48#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
49pub struct FsInfoReply {
50 pub block_info: Option<BlockInfo>,
51 pub available_space: usize,
52}
53
54#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
55pub struct BlockInfo {
56 pub size: usize,
57 pub total: usize,
58 pub available: usize,
59}
60
61impl From<FsInfoReply> for FsInfoExtensionReply {
62 fn from(value: FsInfoReply) -> Self {
63 Self::FsInfo(value)
64 }
65}
66
67impl TryFrom<FsInfoExtensionReply> for FsInfoReply {
68 type Error = Error;
69
70 fn try_from(value: FsInfoExtensionReply) -> Result<Self, Self::Error> {
71 match value {
72 FsInfoExtensionReply::FsInfo(v) => Ok(v),
73 }
74 }
75}
76
77impl Extension for FsInfoExtension {
78 type Request = FsInfoExtensionRequest;
79 type Reply = FsInfoExtensionReply;
80}
81
82pub type FsInfoResult<'a, R, C> = ExtensionResult<'a, FsInfoExtension, R, C>;
83
84pub trait FsInfoClient: ExtensionClient<FsInfoExtension> {
85 fn fs_info(&mut self, location: Location) -> FsInfoResult<'_, FsInfoReply, Self> {
86 self.extension(FsInfoRequest { location })
87 }
88}
89impl<C: ExtensionClient<FsInfoExtension>> FsInfoClient for C {}