17 Commits

Author SHA1 Message Date
1000e3b0e8 Bump version to v1.2.1 2025-10-03 09:19:17 +02:00
87b316fb20 Do not use newline if within parenthesis.
This is useful for some arguments.
2025-10-03 09:13:27 +02:00
8b125ac5e7 Simplify writing with a write buffer. 2025-10-03 09:07:44 +02:00
42c0dad3b1 Ignore generated compressed man page. 2025-10-03 06:11:14 +02:00
49de6d3fd4 Add (un)installation scripts. 2025-10-02 15:44:41 +02:00
9cc79feefe Add man page. 2025-10-02 15:20:28 +02:00
2e74ca7976 README: Add more information to the Usage section. 2025-10-02 15:11:58 +02:00
2884d1dfe6 Correct some language usage in the README. 2025-10-02 15:09:59 +02:00
1ff158c650 Bump version to v1.2.0 2025-10-02 13:56:48 +02:00
9548c2c167 Fix buffer reading. 2025-10-02 13:52:01 +02:00
a123afd052 Simplify formatting. 2025-10-02 12:57:00 +02:00
4dce39e96b Only newline with comma if last_ch == ] or } 2025-10-02 09:59:37 +02:00
5565f1340a Add license to worker.rs file. 2025-09-29 15:16:31 +02:00
b90c5f5f54 Bump version to v1.1.0 2025-09-29 11:43:21 +02:00
2ede3db3b8 Better error messages. 2025-09-29 11:42:34 +02:00
54e4c065ca Limit iteration of args to after program name. 2025-09-29 10:52:26 +02:00
2a1adb048e Remove left-over ch = ch. 2025-09-29 10:48:40 +02:00
9 changed files with 189 additions and 56 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/target
/dbus-prettifier.1.gz

2
Cargo.lock generated
View File

@@ -4,4 +4,4 @@ version = 4
[[package]]
name = "dbus-prettifier"
version = "1.0.0"
version = "1.2.1"

View File

@@ -1,6 +1,6 @@
[package]
name = "dbus-prettifier"
version = "1.0.0"
version = "1.2.1"
edition = "2024"
authors = [ "Nicolás A. Ortega Froysa <nicolas@ortegas.org>" ]
description = "A tool to prettify the output of qdbus."

View File

@@ -1,8 +1,8 @@
# DBus Prettifier
I noticed that when working with `qdbus` that I would get long and unformatted
outputs that are extremely difficult to read. This small program will prettify a
file with the output so that it is much more readable.
I noticed when working with `qdbus` that I would get long and unformatted
outputs that are extremely difficult to read. This small program will prettify
a file with the output so that it is much more readable.
## Usage
@@ -12,18 +12,29 @@ To run the program, simply run it as follows:
qdbus-prettifier <in-file> [out-file]
```
## Building
If `<in-file>` is defined as `-` this tells the program to read from `stdin`
allowing input to be piped. If the `[out-file]` option is omitted then output is
sent to `stdout`.
For more information, check out the `-h` option.
## Building & Installation
To compile the program, install the Rust suite, namely the compiler and Cargo.
Once installed you can run `cargo build --release` to generate a release build
of the project which will be found at `target/release/dbus-prettifier`.
To install you can use the `install` command as follows:
To install the program you can use the `install` script. By default this will
install to `/usr/local`, but this can be changed by setting the `PREFIX`
variable prior to the command. For example:
```console
install -Dm755 target/release/dbus-prettifier /usr/local/bin
PREFIX=/usr ./install
```
Similarly, to uninstall simply run the `uninstall` script. It uses the same
`PREFIX` variable.
## License
This program is licensed under the terms & conditions of the [Zlib

37
dbus-prettifier.1 Normal file
View File

@@ -0,0 +1,37 @@
.TH dbus-prettifier "1" "October 2025" "dbus-prettifier 1.2.1" "User Commands"
.SH "NAME"
dbus-prettifier - A tool to prettify the output of qdbus.
.SH "SYNOPSIS"
.B dbus-prettifier
<\fIin-file\fR> [\fIout-file\fR]
.B dbus-prettifier
\fI-h\fR | \fI-v\fR
.SH "DESCRIPTION"
Takes input from qdbus (either stored in a file or from \fIstdin\fR) and stores
it in the provided \fIout-file\fR.
.SH "ARGUMENTS"
.TP
\fBin-file\fR
File containing qdbus output (if \fI-\fR then input is from \fIstdin\fR)
.TP
\fBout-file\fR
File to write formatted output to (if omitted then \fIstdout\fR is used)
.TP
\fB\-h\fR
Show help information
.TP
\fB\-v\fR
Show version information
.SH "AUTHOR"
Written by Nicolás A. Ortega Froysa.
.SH "COPYRIGHT"
Copyright \(co 2024 Ortega Froysa, Nicolás A. <nicolas@ortegas.org>.
License: ZLib License.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

17
install Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -euo pipefail
PREFIX=${PREFIX:="/usr/local"}
if ! [ -f "./target/release/dbus-prettifier" ]
then
>&2 echo "Failed to find release target. Please compile the project with 'cargo build --release'."
exit 1
fi
gzip -k ./dbus-prettifier.1
install -Dm644 ./dbus-prettifier.1.gz "$PREFIX/share/man/man1/"
install -Dm755 ./target/release/dbus-prettifier "$PREFIX/bin/"
rm -f ./dbus-prettifier.1.gz

View File

@@ -23,7 +23,6 @@
*/
use std::env;
use std::io;
use std::process;
use crate::worker::work;
@@ -52,7 +51,7 @@ fn print_help() {
env!("CARGO_PKG_NAME"), env!("CARGO_PKG_NAME"));
}
fn main() -> io::Result<()> {
fn main() {
let args:Vec<String> = env::args().collect();
let mut in_path:Option<&str> = None;
let mut out_path:Option<&str> = None;
@@ -63,13 +62,13 @@ fn main() -> io::Result<()> {
process::exit(1);
}
for i in &args {
for i in &args[1..args.len()] {
if i == "-h" {
print_help();
return Ok(());
return;
} else if i == "-v" {
print_version();
return Ok(());
return;
} else if i.starts_with("-") && i != "-" {
eprintln!("Invalid argument '{}'. Use -h for help information.", i);
process::exit(1);
@@ -83,5 +82,9 @@ fn main() -> io::Result<()> {
out_path = Some(args[2].as_str());
}
work(in_path, out_path)
let res = work(in_path, out_path);
if let Err(err) = res {
eprintln!("{}", err);
process::exit(1);
}
}

View File

@@ -1,16 +1,42 @@
/*
* Copyright (C) 2025 Nicolás Ortega Froysa <nicolas@ortegas.org> All rights reserved.
* Author: Nicolás Ortega Froysa <nicolas@ortegas.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*/
use std::io;
use std::fs;
use std::io::Read;
use std::boxed::Box;
// Read 1KiB of the file at a time.
static BLOCK_SIZE:usize = 1024;
static MAX_WRITE_BUF_SIZE:usize = 1024;
pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> io::Result<()> {
let mut in_reader:Box<dyn io::Read> = match in_path {
Some(x) => {
let in_file = fs::File::open(x)?;
Box::new(io::BufReader::new(in_file))
pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> Result<(), String> {
let in_reader:Box<dyn io::Read> = match in_path {
Some(path) => {
let in_file = fs::File::open(path);
if let Err(e) = in_file {
return Err(format!("{path}: {e}"));
}
Box::new(io::BufReader::new(in_file.unwrap()))
},
None => {
Box::new(io::stdin())
@@ -18,60 +44,85 @@ pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> io::Result<()> {
};
let mut out_writer:Box<dyn io::Write> = match out_path {
Some(x) => {
let out_file = fs::File::create(x)?;
Box::new(io::BufWriter::new(out_file))
Some(path) => {
let out_file = fs::File::create(path);
if let Err(e) = out_file {
return Err(format!("{path}: {e}"));
}
Box::new(io::BufWriter::new(out_file.unwrap()))
},
None => {
Box::new(io::stdout())
},
};
let mut read_buf:[u8; BLOCK_SIZE] = [0; BLOCK_SIZE];
let mut last_ch:char = '\0';
let mut last_ch = '\0';
let mut tab_num = 0;
let mut in_paren = false;
let mut write_buf = String::new();
while in_reader.read(&mut read_buf)? > 0 {
for i in read_buf {
let ch = i as char;
match ch {
'[' | '{' => {
tab_num += 1;
out_writer.write(format!("{}\n", ch).as_bytes())?;
for i in in_reader.bytes() {
let ch = i.unwrap() as char;
match ch {
'[' | '{' => {
tab_num += 1;
//write_buf += format!("{ch}\n").as_str();
write_buf.push(ch);
if !in_paren {
write_buf.push('\n');
for _ in 0..tab_num {
out_writer.write(b" ")?;
write_buf += " ";
}
last_ch = ' ';
},
']' | '}' => {
tab_num -= 1;
out_writer.write(b"\n")?;
for _ in 0..tab_num {
out_writer.write(b" ")?;
}
out_writer.write(format!("{}", ch).as_bytes())?;
} else {
last_ch = ch;
},
',' => {
out_writer.write(format!("{}\n", ch).as_bytes())?;
}
},
']' | '}' => {
tab_num -= 1;
if !in_paren {
write_buf += "\n";
for _ in 0..tab_num {
out_writer.write(b" ")?;
write_buf += " ";
}
}
write_buf.push(ch);
last_ch = ch;
},
',' => {
write_buf.push(ch);
if last_ch == '}' || last_ch == ']' {
write_buf.push('\n');
for _ in 0..tab_num {
write_buf += " ";
}
last_ch = ' ';
},
_ => {
let ch = ch;
if ch != ' ' || last_ch != ' ' {
out_writer.write(format!("{}", ch).as_bytes())?;
last_ch = ch;
} else {
last_ch = ch;
}
},
_ => {
if ch != ' ' || last_ch != ' ' {
if ch == '(' {
in_paren = true;
} else if ch == ')' {
in_paren = false;
}
},
}
write_buf.push(ch);
last_ch = ch;
}
},
}
if write_buf.len() >= MAX_WRITE_BUF_SIZE {
out_writer.write_all(write_buf.as_bytes()).unwrap();
write_buf.clear();
}
}
out_writer.flush()?;
if write_buf.len() > 0 {
out_writer.write_all(write_buf.as_bytes()).unwrap();
}
Ok(())
}

13
uninstall Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
set -euo pipefail
PREFIX=${PREFIX:="/usr/local"}
if ! [ -f "$PREFIX/bin/dbus-prettifier" ]
then
>&2 echo "Installation not found in prefix '$PREFIX'."
exit 1
fi
rm -f "$PREFIX/bin/dbus-prettifier"
rm -f "$PREFIX/share/man/man1/dbus-prettifier.1.gz"