Skip to main content

trussed_fs_info/
lib.rs

1// Copyright (C) Nitrokey GmbH
2// SPDX-License-Identifier: CC0-1.0
3
4#![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 {}