mirror of
https://github.com/Revertron/Alfis
synced 2024-11-07 09:20:31 +00:00
Made some pancurses interface, but it will lead to a bunch of problems. Commiting just for the history, will change it to web-view.
This commit is contained in:
parent
b5e36da737
commit
3eaf63ba79
@ -3,13 +3,14 @@ name = "wyrd_ns"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Revertron <rev@revertron.com>"]
|
authors = ["Revertron <rev@revertron.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
#![windows_subsystem = "windows"]
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rust-crypto = "^0.2"
|
rust-crypto = "^0.2"
|
||||||
num_cpus = "1.10.1"
|
num_cpus = "1.10.1"
|
||||||
byteorder = "1.3.2"
|
byteorder = "1.3.2"
|
||||||
|
pancurses = "0.16"
|
||||||
serde = { version = "1.0.102", features = ["derive"] }
|
serde = { version = "1.0.102", features = ["derive"] }
|
||||||
serde_json = "1.0.42"
|
serde_json = "1.0.42"
|
||||||
num-bigint = "0.2"
|
num-bigint = "0.2"
|
||||||
|
183
src/main.rs
183
src/main.rs
@ -1,8 +1,187 @@
|
|||||||
|
#![windows_subsystem = "windows"]
|
||||||
|
extern crate pancurses;
|
||||||
|
use pancurses::{initscr, endwin, Input, noecho, resize_term, Window, start_color, init_pair, colorpair::ColorPair, COLOR_PAIR};
|
||||||
|
|
||||||
use wyrd_ns::{Blockchain, Block, Action, Transaction, Signature, Key};
|
use wyrd_ns::{Blockchain, Block, Action, Transaction, Signature, Key};
|
||||||
|
|
||||||
|
const COLOR_TEXT: i16 = 0;
|
||||||
|
const COLOR_TITLE: i16 = 1;
|
||||||
|
const COLOR_MENU_NORMAL: i16 = 2;
|
||||||
|
const COLOR_MENU_FOCUSED: i16 = 3;
|
||||||
|
const COLOR_STATUS: i16 = 4;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Wyrd DNS 0.1.0");
|
println!("Wyrd DNS 0.1.0");
|
||||||
test_blockchain()
|
run_interface();
|
||||||
|
//test_blockchain()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_colors() {
|
||||||
|
start_color();
|
||||||
|
let background = pancurses::COLOR_BLACK;
|
||||||
|
let accent = pancurses::COLOR_CYAN;
|
||||||
|
let text = pancurses::COLOR_WHITE;
|
||||||
|
|
||||||
|
init_pair(COLOR_TEXT, text, background);
|
||||||
|
init_pair(COLOR_TITLE, background, accent);
|
||||||
|
init_pair(COLOR_MENU_NORMAL, text, background);
|
||||||
|
init_pair(COLOR_MENU_FOCUSED, background, accent);
|
||||||
|
init_pair(COLOR_STATUS, background, accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_title(win: &Window, title: &str) {
|
||||||
|
win.color_set(COLOR_TITLE);
|
||||||
|
win.mvprintw(0, win.get_beg_x(), format!("{:width$}", title, width = win.get_max_x() as usize));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw_status(win: &Window, title: &str) {
|
||||||
|
win.color_set(COLOR_TITLE);
|
||||||
|
win.mvprintw(win.get_max_y() - 1, win.get_beg_x(), format!("{:width$}", title, width = win.get_max_x() as usize));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct MenuItem {
|
||||||
|
id: usize,
|
||||||
|
caption: String,
|
||||||
|
hint: String
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MenuItem {
|
||||||
|
pub fn simple<S: Into<String>>(id: usize, caption: S) -> Self {
|
||||||
|
MenuItem{ id, caption: caption.into(), hint: String::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn full<S: Into<String>>(id: usize, caption: S, hint: S) -> Self {
|
||||||
|
MenuItem{ id, caption: caption.into(), hint: hint.into() }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn separator() -> Self {
|
||||||
|
MenuItem { id: 0, caption: String::new(), hint: String::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_separator(&self) -> bool {
|
||||||
|
self.caption.is_empty()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_id(&self) -> usize {
|
||||||
|
self.id
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_caption(&self) -> &str {
|
||||||
|
&self.caption
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_hint(&self) -> &str {
|
||||||
|
&self.hint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Menu {
|
||||||
|
x: i32,
|
||||||
|
y: i32,
|
||||||
|
items: Vec<MenuItem>,
|
||||||
|
position: usize,
|
||||||
|
max_width: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Menu {
|
||||||
|
fn new(x: i32, y: i32, items: Vec<MenuItem>) -> Self {
|
||||||
|
let mut max = 0;
|
||||||
|
for item in items.iter() {
|
||||||
|
if item.get_caption().len() > max {
|
||||||
|
max = item.get_caption().len();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Menu{ x, y, items, position: 0, max_width: max }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn up(&mut self) {
|
||||||
|
if self.position > 0 {
|
||||||
|
self.position = self.position - 1;
|
||||||
|
if self.items[self.position].is_separator() {
|
||||||
|
self.up();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn down(&mut self) {
|
||||||
|
if self.position < (self.items.len() - 1) {
|
||||||
|
self.position = self.position + 1;
|
||||||
|
if self.items[self.position].is_separator() {
|
||||||
|
self.down();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn position(&self) -> usize {
|
||||||
|
self.position
|
||||||
|
}
|
||||||
|
|
||||||
|
fn current(&self) -> &MenuItem {
|
||||||
|
&self.items[self.position]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn paint(&self, win: &Window) {
|
||||||
|
let mut pos = 0;
|
||||||
|
for item in self.items.iter() {
|
||||||
|
let color = { if pos == self.position {COLOR_MENU_FOCUSED} else {COLOR_MENU_NORMAL} };
|
||||||
|
win.color_set(color);
|
||||||
|
win.mvprintw(self.y + pos as i32, self.x, format!(" {:width$} ", item.get_caption(), width = self.max_width));
|
||||||
|
pos = pos + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_interface() {
|
||||||
|
let window = initscr();
|
||||||
|
resize_term(24, 80);
|
||||||
|
init_colors();
|
||||||
|
draw_title(&window, " Wyrd 0.1.0");
|
||||||
|
window.refresh();
|
||||||
|
window.keypad(true);
|
||||||
|
window.timeout(20);
|
||||||
|
pancurses::noecho();
|
||||||
|
window.keypad(true);
|
||||||
|
pancurses::curs_set(0);
|
||||||
|
let mut menu = create_menu();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
match window.getch() {
|
||||||
|
Some(Input::Character(c)) => {
|
||||||
|
if c == '\n' {
|
||||||
|
println!("Selected {:?}", menu.current());
|
||||||
|
} else {
|
||||||
|
window.addch(c);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Some(Input::KeyResize) => { resize_term(0, 0); },
|
||||||
|
Some(Input::KeyUp) => { menu.up(); },
|
||||||
|
Some(Input::KeyDown) => { menu.down(); },
|
||||||
|
Some(Input::KeyEnter) => { println!("Selected {:?}", menu.current()); },
|
||||||
|
Some(Input::KeyDC) => break,
|
||||||
|
Some(input) => { window.addstr(&format!("{:?}", input)); },
|
||||||
|
None => ()
|
||||||
|
}
|
||||||
|
draw_status(&window, menu.current().get_hint());
|
||||||
|
menu.paint(&window);
|
||||||
|
window.refresh();
|
||||||
|
}
|
||||||
|
endwin();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_menu() -> Menu {
|
||||||
|
let menu_items = vec![
|
||||||
|
MenuItem::full(1, "Key create", "Create keypair to sign domain operations"),
|
||||||
|
MenuItem::full(2, "Key load", "Load existing keypair"),
|
||||||
|
MenuItem::separator(),
|
||||||
|
MenuItem::full(3, "Domain create new", "Create and mine new domain"),
|
||||||
|
MenuItem::full(4, "Domain change records", "Change DNS records for your domain"),
|
||||||
|
MenuItem::full(5, "Domain renew", "Renew your domain name, needs additional mining"),
|
||||||
|
MenuItem::full(6, "Domain transfer", "Transfer your domain to a new owner (new keypair)"),
|
||||||
|
MenuItem::separator(),
|
||||||
|
MenuItem::full(7, "Test blockchain", "Do some test blockchain operations with simple mining")
|
||||||
|
];
|
||||||
|
Menu::new(1, 3, menu_items)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_blockchain() -> () {
|
fn test_blockchain() -> () {
|
||||||
@ -11,7 +190,7 @@ fn test_blockchain() -> () {
|
|||||||
let signature = Signature::from_file("default.key", "").unwrap();
|
let signature = Signature::from_file("default.key", "").unwrap();
|
||||||
|
|
||||||
// Creating transaction
|
// Creating transaction
|
||||||
let action = Action::new_domain("test.zz".to_owned(), &signature, vec!["AAAA IN 301:2925::1".to_owned()], vec![], 365);
|
let action = Action::new_domain("test.zz".to_owned(), &signature, vec!["AAAA IN 301:2925::1".to_owned()], vec!["testing".to_owned(), "example".to_owned()], 365);
|
||||||
let mut transaction = Transaction::new(action, signature.get_public().clone());
|
let mut transaction = Transaction::new(action, signature.get_public().clone());
|
||||||
|
|
||||||
// Signing it with private key from Signature
|
// Signing it with private key from Signature
|
||||||
|
Loading…
Reference in New Issue
Block a user