13 Commits

8 changed files with 167 additions and 41 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.1.0"
version = "1.2.1"

View File

@@ -1,6 +1,6 @@
[package]
name = "dbus-prettifier"
version = "1.1.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

@@ -1,13 +1,36 @@
/*
* 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>) -> Result<(), String> {
let mut in_reader:Box<dyn io::Read> = match in_path {
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 {
@@ -33,49 +56,73 @@ pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> Result<(), String>
},
};
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).unwrap() > 0 {
for i in read_buf {
let ch = i as char;
match ch {
'[' | '{' => {
tab_num += 1;
out_writer.write(format!("{}\n", ch).as_bytes()).unwrap();
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" ").unwrap();
write_buf += " ";
}
last_ch = ' ';
},
']' | '}' => {
tab_num -= 1;
out_writer.write(b"\n").unwrap();
for _ in 0..tab_num {
out_writer.write(b" ").unwrap();
}
out_writer.write(format!("{}", ch).as_bytes()).unwrap();
} else {
last_ch = ch;
},
',' => {
out_writer.write(format!("{}\n", ch).as_bytes()).unwrap();
}
},
']' | '}' => {
tab_num -= 1;
if !in_paren {
write_buf += "\n";
for _ in 0..tab_num {
out_writer.write(b" ").unwrap();
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 = ' ';
},
_ => {
if ch != ' ' || last_ch != ' ' {
out_writer.write(format!("{}", ch).as_bytes()).unwrap();
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().unwrap();
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"