init
This commit is contained in:
		
							
								
								
									
										130
									
								
								cmd/dataunit.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								cmd/dataunit.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,130 @@
 | 
			
		||||
// This is free and unencumbered software released into the public domain.
 | 
			
		||||
 | 
			
		||||
// Anyone is free to copy, modify, publish, use, compile, sell, or
 | 
			
		||||
// distribute this software, either in source code form or as a compiled
 | 
			
		||||
// binary, for any purpose, commercial or non-commercial, and by any
 | 
			
		||||
// means.
 | 
			
		||||
 | 
			
		||||
// In jurisdictions that recognize copyright laws, the author or authors
 | 
			
		||||
// of this software dedicate any and all copyright interest in the
 | 
			
		||||
// software to the public domain. We make this dedication for the benefit
 | 
			
		||||
// of the public at large and to the detriment of our heirs and
 | 
			
		||||
// successors. We intend this dedication to be an overt act of
 | 
			
		||||
// relinquishment in perpetuity of all present and future rights to this
 | 
			
		||||
// software under copyright law.
 | 
			
		||||
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
			
		||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
			
		||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | 
			
		||||
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 | 
			
		||||
// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | 
			
		||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | 
			
		||||
// OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
// For more information, please refer to <https://unlicense.org/>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
	dataunit - a simple CLI tool for data units convertion.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
module main
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import flag
 | 
			
		||||
import dataunits
 | 
			
		||||
 | 
			
		||||
const units = {
 | 
			
		||||
	'bit':    dataunits.bit
 | 
			
		||||
	'nibble': dataunits.nibble
 | 
			
		||||
	'bytes':  dataunits.bytes
 | 
			
		||||
	'kb':     dataunits.kb
 | 
			
		||||
	'mb':     dataunits.mb
 | 
			
		||||
	'gb':     dataunits.gb
 | 
			
		||||
	'tb':     dataunits.tb
 | 
			
		||||
	'pb':     dataunits.pb
 | 
			
		||||
	'zb':     dataunits.zb
 | 
			
		||||
	'yb':     dataunits.yb
 | 
			
		||||
	'kib':    dataunits.kib
 | 
			
		||||
	'mib':    dataunits.mib
 | 
			
		||||
	'gib':    dataunits.gib
 | 
			
		||||
	'tib':    dataunits.tib
 | 
			
		||||
	'pib':    dataunits.pib
 | 
			
		||||
	'zib':    dataunits.zib
 | 
			
		||||
	'yib':    dataunits.yib
 | 
			
		||||
	'kbit':   dataunits.kbit
 | 
			
		||||
	'mbit':   dataunits.mbit
 | 
			
		||||
	'gbit':   dataunits.gbit
 | 
			
		||||
	'tbit':   dataunits.tbit
 | 
			
		||||
	'pbit':   dataunits.pbit
 | 
			
		||||
	'zbit':   dataunits.zbit
 | 
			
		||||
	'ybit':   dataunits.ybit
 | 
			
		||||
	'kibit':  dataunits.kibit
 | 
			
		||||
	'mibit':  dataunits.mibit
 | 
			
		||||
	'gibit':  dataunits.gibit
 | 
			
		||||
	'tibit':  dataunits.tibit
 | 
			
		||||
	'pibit':  dataunits.pibit
 | 
			
		||||
	'zibit':  dataunits.zibit
 | 
			
		||||
	'yibit':  dataunits.yibit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn units_str() string {
 | 
			
		||||
	mut str := []string{}
 | 
			
		||||
	for key, _ in units {
 | 
			
		||||
		str << key
 | 
			
		||||
	}
 | 
			
		||||
	return str.join(', ')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@[name: 'dataunit']
 | 
			
		||||
struct FlagConfig {
 | 
			
		||||
	help bool
 | 
			
		||||
	from string @[short: f]
 | 
			
		||||
	to   string @[short: t]
 | 
			
		||||
mut:
 | 
			
		||||
	value f64 @[ignore]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
	mut flags, no_matches := flag.to_struct[FlagConfig](os.args, skip: 1, style: .v) or {
 | 
			
		||||
		eprintln('cmdline parsing error, see -help for info')
 | 
			
		||||
		exit(2)
 | 
			
		||||
	}
 | 
			
		||||
	if no_matches.len > 1 {
 | 
			
		||||
		eprintln('unrecognized arguments: ${no_matches[1..]}')
 | 
			
		||||
		exit(2)
 | 
			
		||||
	} else if no_matches.len == 1 {
 | 
			
		||||
		flags.value = no_matches[0].f64()
 | 
			
		||||
	}
 | 
			
		||||
	if flags.help {
 | 
			
		||||
		println('convert the value between *from* and *to* units.')
 | 
			
		||||
		println('usage: dataunit -f <unit> -t <unit> <value>')
 | 
			
		||||
		println('options:')
 | 
			
		||||
		println('  -help      print this help message and exit')
 | 
			
		||||
		println('  -f, -from  source data unit')
 | 
			
		||||
		println('  -t, -to    destination data unit')
 | 
			
		||||
		exit(0)
 | 
			
		||||
	}
 | 
			
		||||
	if flags.from == '' || flags.to == '' {
 | 
			
		||||
		eprintln('no -from or -to flag set, see -help for info')
 | 
			
		||||
		exit(2)
 | 
			
		||||
	}
 | 
			
		||||
	if flags.value == 0 {
 | 
			
		||||
		eprintln('no value passed, see -help for info')
 | 
			
		||||
		exit(2)
 | 
			
		||||
	}
 | 
			
		||||
	unit_from := units[flags.from.to_lower()] or {
 | 
			
		||||
		eprintln('invalid unit ${flags.from}, valid ones: ${units_str()}')
 | 
			
		||||
		exit(1)
 | 
			
		||||
	}
 | 
			
		||||
	unit_to := units[flags.to.to_lower()] or {
 | 
			
		||||
		eprintln('invalid unit ${flags.to}, valid ones: ${units_str()}')
 | 
			
		||||
		exit(1)
 | 
			
		||||
	}
 | 
			
		||||
	result := '${dataunits.convert(flags.value, unit_from, unit_to):.20f}'
 | 
			
		||||
	splitted := result.split('.')
 | 
			
		||||
	if splitted[1].contains_only('0') {
 | 
			
		||||
		println(splitted[0])
 | 
			
		||||
	} else {
 | 
			
		||||
		println(result.trim_right('0'))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user