Compare commits
No commits in common. "a8a1284ae1942326fc59d7192935c588975a044d" and "9728ed68f306d6acf9522d086c84d9224cdc2808" have entirely different histories.
a8a1284ae1
...
9728ed68f3
25
Cargo.lock
generated
25
Cargo.lock
generated
@ -1,25 +0,0 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
version = 3
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde"
|
|
||||||
version = "1.0.148"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tomcat"
|
|
||||||
version = "0.0.1"
|
|
||||||
dependencies = [
|
|
||||||
"toml",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "toml"
|
|
||||||
version = "0.5.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
|
|
||||||
dependencies = [
|
|
||||||
"serde",
|
|
||||||
]
|
|
16
Cargo.toml
16
Cargo.toml
@ -1,16 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "tomcat"
|
|
||||||
version = "0.0.1"
|
|
||||||
edition = "2021"
|
|
||||||
license = "AGPL-3.0-or-later"
|
|
||||||
authors = [ "Emma Tebibyte <emma@tebibyte.media>" ]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
toml = "0.5.9"
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
strip = true # strip symbols from the binary
|
|
||||||
opt-level = "z" # optimize for size
|
|
||||||
lto = true # link time optimization
|
|
||||||
codegen-units = 1 # decrease parallelization
|
|
||||||
panic = "abort"
|
|
43
src/main.rs
43
src/main.rs
@ -1,43 +0,0 @@
|
|||||||
// Copyright (c) 2022 Emma Tebibyte
|
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
|
|
||||||
/* Tomcat is free software: you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU Affero General Public License as published by the
|
|
||||||
* Free Software Foundation, either version 3 of the License, or (at your
|
|
||||||
* option) any later version.
|
|
||||||
*
|
|
||||||
* Tomcat is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
||||||
* details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see https://www.gnu.org/licenses/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
use std::env;
|
|
||||||
use std::fs::File;
|
|
||||||
use std::io::Read;
|
|
||||||
use std::path::Path;
|
|
||||||
|
|
||||||
use toml::Value;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let arguments: Vec<String> = env::args().collect();
|
|
||||||
let argv0 = &arguments[0];
|
|
||||||
let input = &arguments[2];
|
|
||||||
let mut content = String::new();
|
|
||||||
|
|
||||||
let file = Path::new(&input);
|
|
||||||
if file.is_file() {
|
|
||||||
File::open(file).expect("").read_to_string(&mut content).unwrap();
|
|
||||||
} else { content = input.to_string(); }
|
|
||||||
|
|
||||||
let keyval: Vec<&str> = arguments[1].split(".").collect();
|
|
||||||
let toml = content.parse::<Value>().unwrap();
|
|
||||||
|
|
||||||
match toml.get(keyval[1]) {
|
|
||||||
Some(value) => println!("{}", value),
|
|
||||||
None => println!("{}: {}: No such table or key.", argv0, arguments[1]),
|
|
||||||
};
|
|
||||||
}
|
|
73
tomcat
Executable file
73
tomcat
Executable file
@ -0,0 +1,73 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
argv0="$0"
|
||||||
|
argv1="$1"
|
||||||
|
argv2="$2"
|
||||||
|
|
||||||
|
# check usage
|
||||||
|
if ! test -n "$1"; then
|
||||||
|
printf "Usage: %s [OPTIONS] [TABLE.KEY[INDEX]] [FILE]\n" "$0" 1>&2
|
||||||
|
exit 64 # sysexits(3) EX_USAGE
|
||||||
|
fi
|
||||||
|
|
||||||
|
# test if input has a period
|
||||||
|
if test -n "$(printf "%s\n" "$argv1" | sed -n '/.*\..*/p')"; then
|
||||||
|
# cut out everything beyond the first period for TABLE
|
||||||
|
TABLE=$(printf "%s\n" "$argv1" | sed -n 's/\..*//p')
|
||||||
|
|
||||||
|
# cut out everything before the first period for KEY
|
||||||
|
KEY=$(printf "%s\n" "$argv1" | sed -n 's/^[^.]*\.//p')
|
||||||
|
! test -n "$KEY" &&\
|
||||||
|
printf "%s: No key specified\n" "$argv0" 1>&2 &&\
|
||||||
|
exit 65 # sysexits(3) EX_DATAERR
|
||||||
|
else
|
||||||
|
printf "%s: No key specified\n" "$argv0" 1>&2
|
||||||
|
exit 65 # sysexits(3) EX_DATAERR
|
||||||
|
fi
|
||||||
|
|
||||||
|
# remove array index from KEY
|
||||||
|
KEY=$(printf "%s\n" "$KEY" | sed 's/\[.*\]//g')
|
||||||
|
# set ARR to the array index
|
||||||
|
ARR=$(printf "%s\n" "$argv1" | sed -n 's/.\+\[//p' | tr -d ']')
|
||||||
|
|
||||||
|
# test if argument 2 is a file or not
|
||||||
|
if test -e "$argv2"; then
|
||||||
|
# set TOML to the text from the file
|
||||||
|
TOML=$(sed 's/[^"#]#\+.*//g' <"$argv2" | sed 's/^#.*//g' )
|
||||||
|
else
|
||||||
|
# set TOML to the text from stdin
|
||||||
|
TOML=$(printf "%s\n" "$argv2" | sed 's/[^"#]#\+.*//g')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -n "$TABLE"; then
|
||||||
|
KEYS=$(printf "%s\n" "$TOML" |\
|
||||||
|
# output only lines between TABLE and the next table
|
||||||
|
awk "/^\[$TABLE\]/{flag=1; next} /^\[/{flag=0} flag" - )
|
||||||
|
else
|
||||||
|
KEYS=$(printf "%s\n" "$TOML" |\
|
||||||
|
# output only lines before the first table
|
||||||
|
awk '1;/^\[/{exit}' - | sed -n '/^[^[]/p')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# set VAL to the parsed KEYS list
|
||||||
|
VAL=$(printf "%s\n" "$KEYS" |\
|
||||||
|
# remove the key from the string and delineate arrays, removing
|
||||||
|
# brackets, trailing commas, and leading spaces
|
||||||
|
sed -n "s/$KEY *= *//p" | sed 's/", "/ /g' | tr -d '[]"' |\
|
||||||
|
sed 's/, *$//g' | sed 's/^ \+//g' | sed 's/ \+$//g')
|
||||||
|
|
||||||
|
# test if ARR is set; if it is, then we have an array index to grab
|
||||||
|
if test -n "$ARR"; then
|
||||||
|
# change the line delineator to newlines for parsing and output the result
|
||||||
|
printf "%s\n" "$VAL" | sed 's/ /\n/g' | head -n "$ARR" |\
|
||||||
|
tail -n 1
|
||||||
|
elif ! test -n "$VAL"; then
|
||||||
|
printf "%s: %s: No such key or table\n" "$argv0" "$argv1" 1>&2
|
||||||
|
exit 65 # sysexits(3) EX_DATAERR
|
||||||
|
else
|
||||||
|
printf "%s\n" "$VAL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
Loading…
Reference in New Issue
Block a user