Skip to main content

ordinary_api/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![doc = include_str!("../README.md")]
3#![warn(clippy::all, clippy::pedantic)]
4#![allow(
5    clippy::needless_for_each,
6    clippy::missing_errors_doc,
7    clippy::cast_precision_loss,
8    clippy::match_wildcard_for_single_variants,
9    clippy::similar_names
10)]
11
12// Copyright (C) 2026 Ordinary Labs, LLC.
13//
14// SPDX-License-Identifier: AGPL-3.0-only
15
16use serde::{Deserialize, Serialize};
17use std::collections::BTreeMap;
18use utoipa::ToSchema;
19
20/// Client components for facilitating interaction with [`OrdinaryApiServer`]
21#[cfg(feature = "client")]
22pub mod client;
23
24/// Server components for setting up an [`OrdinaryApiServer`]
25#[cfg(feature = "server")]
26pub mod server;
27
28fn permissions_field(idx: u8) -> ordinary_types::Field {
29    ordinary_types::Field {
30        idx,
31        name: "permissions".into(),
32        kind: ordinary_types::Kind::List {
33            kind: Box::new(ordinary_types::Kind::Enum {
34                name: "permissions".into(),
35                opts: vec![
36                    ordinary_types::EnumOpt {
37                        idx: 0,
38                        name: "admin".into(),
39                    },
40                    ordinary_types::EnumOpt {
41                        idx: 1,
42                        name: "read".into(),
43                    },
44                    ordinary_types::EnumOpt {
45                        idx: 2,
46                        name: "write".into(),
47                    },
48                    ordinary_types::EnumOpt {
49                        idx: 3,
50                        name: "update".into(),
51                    },
52                    ordinary_types::EnumOpt {
53                        idx: 4,
54                        name: "upload".into(),
55                    },
56                    ordinary_types::EnumOpt {
57                        idx: 5,
58                        name: "install".into(),
59                    },
60                    ordinary_types::EnumOpt {
61                        idx: 6,
62                        name: "deploy".into(),
63                    },
64                    ordinary_types::EnumOpt {
65                        idx: 7,
66                        name: "bridge".into(),
67                    },
68                    ordinary_types::EnumOpt {
69                        idx: 8,
70                        name: "kill".into(),
71                    },
72                    ordinary_types::EnumOpt {
73                        idx: 9,
74                        name: "erase".into(),
75                    },
76                ],
77            }),
78        },
79        ..Default::default()
80    }
81}
82
83#[must_use]
84pub fn api_invite_claims() -> Vec<ordinary_types::Field> {
85    vec![
86        ordinary_types::Field {
87            idx: 1,
88            name: "account".into(),
89            kind: ordinary_types::Kind::String,
90            ..Default::default()
91        },
92        ordinary_types::Field {
93            idx: 2,
94            name: "domain".into(),
95            kind: ordinary_types::Kind::String,
96            ..Default::default()
97        },
98        permissions_field(3),
99    ]
100}
101
102#[must_use]
103pub fn api_account_claims() -> Vec<ordinary_types::Field> {
104    vec![
105        ordinary_types::Field {
106            idx: 1,
107            name: "domain".into(),
108            kind: ordinary_types::Kind::String,
109            ..Default::default()
110        },
111        permissions_field(2),
112    ]
113}
114
115#[derive(Serialize, Deserialize, ToSchema)]
116pub struct ApiInfo {
117    pub system_cpu_count: usize,
118    pub system_cpu_usage: String,
119
120    pub system_memory_total: String,
121    pub system_memory_used: String,
122    pub system_memory_free: String,
123    pub system_memory_available: String,
124
125    pub process_cpu_usage: String,
126    pub process_cpu_time: String,
127
128    #[serde(skip_serializing_if = "Option::is_none")]
129    #[serde(default)]
130    pub process_threads: Option<usize>,
131
132    pub process_memory_real: String,
133    pub process_memory_virtual: String,
134
135    pub process_disk_read: String,
136    pub process_disk_write: String,
137}
138
139#[derive(Serialize, Deserialize, ToSchema)]
140pub struct PortsResponse {
141    #[serde(skip_serializing_if = "Option::is_none")]
142    #[serde(default)]
143    pub app: Option<u16>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    #[serde(default)]
146    pub proxies: Option<BTreeMap<String, u16>>,
147}