1
1
use comfy_table:: presets:: UTF8_FULL ;
2
2
use comfy_table:: Table ;
3
3
use comfy_table:: TableComponent :: * ;
4
+ use indoc:: indoc;
5
+ use text_io:: read;
4
6
5
7
struct Asset {
6
8
ticker : String ,
@@ -32,7 +34,7 @@ fn format_money(cents: u32) -> String {
32
34
format ! ( "${:.2}" , cents as f32 / 100.0 )
33
35
}
34
36
35
- fn print_assets ( assets : & [ Asset ] ) {
37
+ fn print_assets ( assets : & Vec < Asset > ) {
36
38
let mut table = Table :: new ( ) ;
37
39
38
40
// I prefer a Unicode table with solid lines
@@ -80,13 +82,48 @@ fn print_assets(assets: &[Asset]) {
80
82
} ,
81
83
] ) ;
82
84
}
83
-
84
- println ! ( "Assets" ) ;
85
85
println ! ( "{table}" ) ;
86
86
}
87
87
88
+ fn get_current_ticker_price ( _ticker : String ) -> u32 {
89
+ // TODO: use Yahoo Finance for this
90
+ 200
91
+ }
92
+
93
+ fn add_asset ( ) -> Asset {
94
+ print ! ( "Enter ticker: " ) ;
95
+ let symbol: String = read ! ( ) ;
96
+
97
+ print ! ( "Enter buy price in total cents: " ) ;
98
+ let buy_price: u32 = read ! ( ) ;
99
+
100
+ print ! ( "Enter sell price if sold, otherwise enter 'held': " ) ;
101
+ let sell_price_raw: String = read ! ( ) ;
102
+
103
+ // if I access a string twice I have to make it owned for some reason - IDK
104
+ // what that means or if there is a better way
105
+ Asset {
106
+ ticker : symbol. to_owned ( ) ,
107
+ buy_price_cents : buy_price,
108
+ current_price_cents : get_current_ticker_price ( symbol) ,
109
+ sell_price_cents : ( if sell_price_raw. eq ( "held" ) {
110
+ None
111
+ } else {
112
+ Some ( sell_price_raw. parse ( ) . unwrap ( ) )
113
+ } ) ,
114
+ }
115
+ }
116
+
117
+ fn print_help ( ) {
118
+ let help_text = indoc ! { "
119
+ assets - prints all assets, both held and sold
120
+ new - adds a new asset
121
+ help - prints this help text" } ;
122
+ println ! ( "{}" , help_text) ;
123
+ }
124
+
88
125
fn main ( ) {
89
- let assets: [ Asset ; 2 ] = [
126
+ let mut assets: Vec < Asset > = vec ! [
90
127
Asset {
91
128
ticker: "MSFT" . to_string( ) ,
92
129
buy_price_cents: 1000 ,
@@ -100,7 +137,17 @@ fn main() {
100
137
sell_price_cents: Some ( 40000 ) ,
101
138
} ,
102
139
] ;
103
-
104
- print_assets ( & assets) ;
105
- println ! ( ) ;
140
+ let mut input: String ;
141
+ loop {
142
+ print ! ( "» " ) ;
143
+ input = read ! ( ) ;
144
+ match input. as_str ( ) {
145
+ // TODO: handle blank input properly somehow
146
+ "assets" => print_assets ( & assets) ,
147
+ "exit" => break ,
148
+ "new" => assets. push ( add_asset ( ) ) ,
149
+ "help" => print_help ( ) ,
150
+ _ => println ! ( "Unknown command. Enter 'help' for a list of valid commands" ) ,
151
+ }
152
+ }
106
153
}
0 commit comments