1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/*!
the mark up text with cycling color program.
# Features
- mark up text with cycling color.
- **Stateful Color Consistency**: Reuses the same color for identical matches within a 50-line window for better visual tracing.
- minimum support rustc 1.68.0 (2c8cc3432 2023-03-06)
# Key Feature: Stateful Color Consistency
Unlike simple color cyclers, `aki-mcycle` remembers the color assigned to a specific match. If the same string appears again within a sliding window (default 50 lines), it reuses the same color. This provides excellent visual continuity when tracing identifiers or specific patterns in log files.
# Performance
`aki-mcycle` is designed for high-performance text processing. It efficiently handles large input streams and extremely long lines by using a sparse memory representation for color segments. This ensures minimal memory footprint even when processing single lines that span multiple megabytes, making it suitable for heavy-duty log analysis.
# Command help
```text
aki-mcycle --help
```
```text
Usage:
aki-mcycle [options]
mark up text with the cyclic color.
Options:
-e, --exp <exp> write it in the cyclic color (default: ' ([0-9A-Z]{3,}):')
-H, --help display this help and exit
-V, --version display version information and exit
Option Parameters:
<exp> regular expression, color the entire match with the cyclic color.
Environments:
AKI_MCYCLE_COLOR_SEQ_RED_ST red start sequence specified by ansi
AKI_MCYCLE_COLOR_SEQ_GREEN_ST green start sequence specified by ansi
AKI_MCYCLE_COLOR_SEQ_BLUE_ST blue start sequence specified by ansi
AKI_MCYCLE_COLOR_SEQ_CYAN_ST cyan start sequence specified by ansi
AKI_MCYCLE_COLOR_SEQ_MAGENTA_ST magenta start sequence specified by ansi
AKI_MCYCLE_COLOR_SEQ_YELLOW_ST yellow start sequence specified by ansi
AKI_MCYCLE_COLOR_SEQ_ED color end sequence specified by ansi
```
# Quick install
1. you can install this into cargo bin path:
```text
cargo install aki-mcycle
```
2. you can build debian package:
```text
cargo deb
```
and install **.deb** into your local repository of debian package.
# Examples
## Command line example 1
Extract "`arm`" from the rustup target list and make "`linux-[^ ]+`" **color**.
- 1st match: makes '`linux-musl`' **red**
- 2nd match: makes '`linux-musleabi`' **green**
- 3rd match: makes '`linux-musleabihf`' **blue**
- 4th match: makes '`linux-muslabi64`' **cyan**
```text
rustup target list | aki-mline -e arm | aki-mcycle -e "linux-[^ ]+"
```
result output :
![out rustup image]
[out rustup image]: https://raw.githubusercontent.com/aki-akaguma/aki-mcycle/main/img/out-rustup-1.png
- [aki-mline](https://crates.io/crates/aki-mline): extract match line command like grep.
# Library example
See [`fn execute()`] for this library examples.
[`fn execute()`]: crate::execute
*/
extern crate anyhow;
use HelpVersion;
use *;
const TRY_HELP_MSG: &str = "Try --help for help.";
///
/// execute mcycle
///
/// params:
/// - sioe: stream in/out/err
/// - program: program name. etc. "mcycle"
/// - args: parameter arguments.
///
/// return:
/// - ok: ()
/// - err: anyhow
///
/// example:
///
/// ```
/// use runnel::RunnelIoeBuilder;
///
/// let r = libaki_mcycle::execute(&RunnelIoeBuilder::new().build(),
/// "mcycle", ["-e", "Message: *[^ ]+"]);
/// ```
///
///
/// execute mcycle with environments
///
/// params:
/// - sioe: stream in/out/err
/// - program: program name. etc. "mcycle"
/// - args: parameter arguments.
/// - env: environments array.
///
/// return:
/// - ok: ()
/// - err: anyhow
///
/// example:
///
/// ```rust
/// use runnel::RunnelIoeBuilder;
///
/// let r = libaki_mcycle::execute_with_env(&RunnelIoeBuilder::new().build(),
/// "mcycle",
/// ["-e", "Message: *[^ ]+"],
/// vec![
/// ("AKI_MCYCLE_COLOR_SEQ_RED_ST", "<R>"),
/// ("AKI_MCYCLE_COLOR_SEQ_GREEN_ST", "<G>"),
/// ("AKI_MCYCLE_COLOR_SEQ_BLUE_ST", "<B>"),
/// ("AKI_MCYCLE_COLOR_SEQ_CYAN_ST", "<C>"),
/// ("AKI_MCYCLE_COLOR_SEQ_MAGENTA_ST", "<M>"),
/// ("AKI_MCYCLE_COLOR_SEQ_YELLOW_ST", "<Y>"),
/// ("AKI_MCYCLE_COLOR_SEQ_ED","<E>"),
/// ]
/// );
/// ```
///