hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

main.ha (1206B)


      1 // SPDX-License-Identifier: GPL-3.0-only
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use bufio;
      5 use fmt;
      6 use fs;
      7 use hare::ast;
      8 use hare::lex;
      9 use hare::parse;
     10 use io;
     11 use os;
     12 use path;
     13 
     14 export fn main() void = {
     15 	let buf = path::init()!;
     16 	let status: int = os::status::SUCCESS;
     17 	iter(&buf, &status);
     18 	os::exit(status);
     19 };
     20 
     21 fn iter(buf: *path::buffer, status: *int) void = {
     22 	let it = os::iter(path::string(buf))!;
     23 	defer fs::finish(it);
     24 	for (let ent => fs::next(it)!) {
     25 		path::push(buf, ent.name)!;
     26 		defer path::pop(buf);
     27 		const st = os::stat(path::string(buf))!;
     28 		if (fs::isfile(st.mode)) {
     29 			match (path::peek_ext(buf)) {
     30 			case let s: str =>
     31 				if (s == "ha") {
     32 					parse(path::string(buf), status);
     33 				};
     34 			case void => void;
     35 			};
     36 		} else if (fs::isdir(st.mode)) {
     37 			iter(buf, status);
     38 		};
     39 	};
     40 };
     41 
     42 fn parse(path: str, status: *int) void = {
     43 	const f = os::open(path)!;
     44 	defer io::close(f)!;
     45 	let sc = bufio::newscanner(f);
     46 	defer bufio::finish(&sc);
     47 	let lexer = lex::init(&sc, path);
     48 	match (parse::subunit(&lexer)) {
     49 	case let su: ast::subunit =>
     50 		ast::subunit_finish(su);
     51 	case let err: parse::error =>
     52 		fmt::errorln(parse::strerror(err))!;
     53 		*status = os::status::FAILURE;
     54 	};
     55 };