parse urls

pull/6/head
dvkt 5 years ago
parent c53af4398d
commit 05f1e6734b

@ -43,3 +43,62 @@ pub fn fetch(host: &str, port: &str, selector: &str) -> io::Result<String> {
Err(e) => Err(e),
}
}
enum Parsing {
Host,
Port,
Selector,
}
// Parses gopher URL into parts.
pub fn parse_url<'a>(url: &'a str) -> (Type, &'a str, &'a str, &'a str) {
let url = url.trim_start_matches("gopher://");
let mut host = "";
let mut port = "70";
let mut sel = "/";
let mut typ = Type::Text;
let mut state = Parsing::Host;
let mut start = 0;
for (i, c) in url.char_indices() {
match state {
Parsing::Host => {
match c {
':' => state = Parsing::Port,
'/' => state = Parsing::Selector,
_ => continue,
}
host = &url[start..i];
start = i + 1;
}
Parsing::Port => {
if c == '/' {
state = Parsing::Selector;
port = &url[start..i];
start = i + 1;
}
}
Parsing::Selector => {}
}
}
match state {
Parsing::Selector => sel = &url[start..],
Parsing::Port => port = &url[start..],
Parsing::Host => host = &url[start..],
};
let mut chars = sel.chars();
if let (Some(fst), Some('/')) = (chars.nth(0), chars.nth(1)) {
match fst {
'0' => typ = Type::Text,
'1' => typ = Type::Menu,
'h' => typ = Type::HTML,
_ => {}
}
sel = &sel[2..];
}
(typ, host, port, sel)
}

@ -29,6 +29,13 @@ pub struct Line {
}
impl View for MenuView {
fn render(&self) -> String {
let mut out = self.menu.raw.to_string();
out.push('\n');
out.push_str(&format!("{:#?}", self));
out
}
fn process_input(&mut self, key: Key) -> Action {
match key {
Key::Char('\n') => return Action::Open,

@ -32,6 +32,7 @@ pub enum Action {
pub trait View {
fn process_input(&mut self, c: Key) -> Action;
fn render(&self) -> String;
}
impl UI {
@ -56,7 +57,12 @@ impl UI {
pub fn render(&self) -> String {
// let (cols, rows) = termion::terminal_size().expect("can't get terminal size");
String::new()
if self.pages.len() > 0 && self.page < self.pages.len() {
if let Some(page) = self.pages.get(self.page) {
return page.render();
}
}
String::from("N/A")
}
pub fn load(&mut self, url: String) {

Loading…
Cancel
Save