1#!/usr/bin/env bash
2set -euo pipefail
3
4# Demo script for logging and validation libraries
5
6# Get the directory where this script is located
7SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
9# Source the libraries
10source "$SCRIPT_DIR/lib/logging.sh"
11source "$SCRIPT_DIR/lib/validation.sh"
12
13# Main demo
14main() {
15 log_section "Library Demo: Logging & Validation"
16
17 # --- Logging Demo ---
18 log_section "Logging Demo"
19
20 log_info "This is an informational message"
21 log_warn "This is a warning message"
22 log_error "This is an error message"
23 log_debug "This debug message won't show (default log level is INFO)"
24
25 echo
26 log_info "Changing log level to DEBUG..."
27 set_log_level DEBUG
28
29 log_debug "Now debug messages are visible!"
30 log_info "Info still shows"
31
32 echo
33 log_info "Enabling file logging..."
34 local log_file="/tmp/demo.log"
35 enable_file_logging "$log_file"
36
37 log_info "This message goes to both console and file"
38 log_warn "Warnings are also logged to file"
39
40 echo
41 log_info "Log file contents:"
42 log_separator
43 cat "$log_file"
44 log_separator
45
46 disable_file_logging
47 rm -f "$log_file"
48
49 # Reset to INFO level
50 set_log_level INFO
51
52 echo
53 log_section "Validation Demo"
54
55 # Email validation
56 log_info "Testing email validation:"
57 local -a emails=(
58 "user@example.com"
59 "invalid.email"
60 "test@domain.co.uk"
61 "@invalid.com"
62 )
63
64 for email in "${emails[@]}"; do
65 if validate_email "$email"; then
66 log_info " ✓ Valid email: $email"
67 else
68 log_warn " ✗ Invalid email: $email"
69 fi
70 done
71
72 echo
73 log_info "Testing IP address validation:"
74 local -a ips=(
75 "192.168.1.1"
76 "256.1.1.1"
77 "10.0.0.1"
78 "invalid.ip"
79 )
80
81 for ip in "${ips[@]}"; do
82 if validate_ip "$ip"; then
83 log_info " ✓ Valid IP: $ip"
84 else
85 log_warn " ✗ Invalid IP: $ip"
86 fi
87 done
88
89 echo
90 log_info "Testing port validation:"
91 local -a ports=(
92 "80"
93 "8080"
94 "65536"
95 "-1"
96 "abc"
97 )
98
99 for port in "${ports[@]}"; do
100 if validate_port "$port"; then
101 log_info " ✓ Valid port: $port"
102 else
103 log_warn " ✗ Invalid port: $port"
104 fi
105 done
106
107 echo
108 log_info "Testing integer checks:"
109 local -a numbers=(
110 "42"
111 "-10"
112 "0"
113 "3.14"
114 "abc"
115 )
116
117 for num in "${numbers[@]}"; do
118 local checks=""
119 is_integer "$num" && checks+="integer " || checks+="not-integer "
120 is_positive "$num" && checks+="positive " || true
121 is_non_negative "$num" && checks+="non-negative " || true
122
123 log_info " $num: $checks"
124 done
125
126 echo
127 log_info "Testing range validation (0-100):"
128 local -a range_tests=(
129 "50"
130 "0"
131 "100"
132 "101"
133 "-1"
134 )
135
136 for num in "${range_tests[@]}"; do
137 if is_in_range "$num" 0 100; then
138 log_info " ✓ $num is in range [0, 100]"
139 else
140 log_warn " ✗ $num is out of range [0, 100]"
141 fi
142 done
143
144 echo
145 log_info "Testing URL validation:"
146 local -a urls=(
147 "https://www.example.com"
148 "http://localhost:8080/path"
149 "ftp://invalid.protocol"
150 "not a url"
151 )
152
153 for url in "${urls[@]}"; do
154 if validate_url "$url"; then
155 log_info " ✓ Valid URL: $url"
156 else
157 log_warn " ✗ Invalid URL: $url"
158 fi
159 done
160
161 echo
162 log_info "Testing hostname validation:"
163 local -a hostnames=(
164 "example.com"
165 "sub.domain.example.com"
166 "invalid..hostname"
167 "-invalid.com"
168 )
169
170 for hostname in "${hostnames[@]}"; do
171 if validate_hostname "$hostname"; then
172 log_info " ✓ Valid hostname: $hostname"
173 else
174 log_warn " ✗ Invalid hostname: $hostname"
175 fi
176 done
177
178 echo
179 log_info "Testing MAC address validation:"
180 local -a macs=(
181 "00:1A:2B:3C:4D:5E"
182 "00-1A-2B-3C-4D-5E"
183 "invalid:mac"
184 "00:1A:2B:3C:4D"
185 )
186
187 for mac in "${macs[@]}"; do
188 if validate_mac "$mac"; then
189 log_info " ✓ Valid MAC: $mac"
190 else
191 log_warn " ✗ Invalid MAC: $mac"
192 fi
193 done
194
195 echo
196 log_info "Testing semantic version validation:"
197 local -a versions=(
198 "1.2.3"
199 "2.0.0-beta"
200 "1.0.0+build.123"
201 "invalid.version"
202 )
203
204 for version in "${versions[@]}"; do
205 if validate_semver "$version"; then
206 log_info " ✓ Valid semver: $version"
207 else
208 log_warn " ✗ Invalid semver: $version"
209 fi
210 done
211
212 echo
213 log_info "Testing hex color validation:"
214 local -a colors=(
215 "#FF5733"
216 "#F57"
217 "FF5733"
218 "#GGGGGG"
219 )
220
221 for color in "${colors[@]}"; do
222 if validate_hex_color "$color"; then
223 log_info " ✓ Valid hex color: $color"
224 else
225 log_warn " ✗ Invalid hex color: $color"
226 fi
227 done
228
229 echo
230 log_info "Testing command existence:"
231 local -a commands=(
232 "bash"
233 "ls"
234 "nonexistent_command_xyz"
235 )
236
237 for cmd in "${commands[@]}"; do
238 if command_exists "$cmd"; then
239 log_info " ✓ Command exists: $cmd"
240 else
241 log_warn " ✗ Command not found: $cmd"
242 fi
243 done
244
245 echo
246 log_info "Testing path validation:"
247 local -a paths=(
248 "/tmp"
249 "/etc/passwd"
250 "/nonexistent/path"
251 )
252
253 for path in "${paths[@]}"; do
254 if validate_path "$path" "any"; then
255 if validate_path "$path" "dir"; then
256 log_info " ✓ Directory exists: $path"
257 else
258 log_info " ✓ File exists: $path"
259 fi
260 else
261 log_warn " ✗ Path not found: $path"
262 fi
263 done
264
265 echo
266 log_section "Demo Complete"
267 log_info "Libraries are now loaded and ready to use"
268 log_info "Available logging functions: log_debug, log_info, log_warn, log_error"
269 log_info "Available validation functions: run 'declare -F | grep validate' to see all"
270}
271
272# Run the demo
273main "$@"