Seregon/StratoSDK

StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.

Rust/27.3 KB/No license
crates/strato-ui-core/src/util.rs
1use std::{fs, io, path::PathBuf};
2 
3use anyhow::Result;
4 
5pub fn post_inc(value: &mut usize) -> usize {
6 let prev = *value;
7 *value += 1;
8 prev
9}
10 
11pub fn save_as_file(bytes: &[u8], output_path: PathBuf) -> Result<()> {
12 let mut content = std::io::Cursor::new(bytes);
13 if let Some(dir) = output_path.parent() {
14 fs::create_dir_all(dir)?;
15 }
16 let mut outfile = fs::File::create(output_path.as_path())?;
17 io::copy(&mut content, &mut outfile)?;
18 Ok(())
19}
20 
21pub fn parse_u32(input: &[u8]) -> Option<u32> {
22 if input.is_empty() {
23 return None;
24 }
25 let mut num: u32 = 0;
26 for c in input {
27 let c = *c as char;
28 let digit = c.to_digit(10)?;
29 num = num.checked_mul(10).and_then(|v| v.checked_add(digit))?;
30 }
31 Some(num)
32}
33 
34pub fn parse_i32(input: &[u8]) -> Option<i32> {
35 if input.is_empty() {
36 return None;
37 }
38 
39 let mut negative = false;
40 let mut input = input;
41 
42 if input[0] == b'-' {
43 negative = true;
44 input = &input[1..];
45 
46 if input.is_empty() {
47 return None;
48 }
49 }
50 
51 let mut num: i32 = 0;
52 for c in input {
53 let c = *c as char;
54 let digit = c.to_digit(10)?;
55 num = num
56 .checked_mul(10)
57 .and_then(|v| v.checked_add(digit as i32))?;
58 }
59 
60 if negative {
61 num = num.checked_neg()?;
62 }
63 
64 Some(num)
65}
66 
67#[cfg(test)]
68#[path = "util_test.rs"]
69mod tests;
70