haru 0.27.3

A fast, dynamically-typed general purpose scripting language
Documentation
#!/home/user/Development/hana/target/release/haru

record TodoProgram

    // loading
    function start(self) begin
        args = Sys::args()
        if args.length() > 1 then return self.handle(args)
        return self.help()
    end

    // cli
    function help(self) begin
        print(
"Arguments:
    - add [string]: adds a note in your list
    - update [idx] [string]: replaces note at index [idx] with [string]
    - list: lists all todo notes
    - remove [idx]: removes note at index [idx] from your list
")
    end

    function handle(self, args) begin
        method = args[1]
        function expect_arg(idx, name) begin
            if idx >= args.length() begin
                raise "method " + method + " expects argument for " + name
            end
            return args[idx]
        end
        if method == "add" then return self.add(expect_arg(2, "note"))
        if method == "update" then return self.update(expect_arg(2, "index"), expect_arg(3, "note"))
        if method == "list" then return self.list()
        if method == "remove" then return self.remove(expect_arg(2, "index"))
        print("Unknown method " + method + "\n")
        return self.help()
    end

    // todo functions
    function add(self, note) begin
        file = File("/tmp/notes", "cra")
        file.write(note + "\n")
        print("Added note for '" + note + "'\n")
    end

    function update(self, idx, note) begin
        file = File("/tmp/notes", "crw")
        idx = Int(idx)
        state = [0]
        lines = file.read().split("\n").map(|line| {
            if state[0] == idx - 1 begin
                state[0] += 1
                print("Updated index " + idx + " to '" + note + "'\n")
                return note
            end
            else begin
                state[0] += 1
                return line
            end
        })
        file.close()
        file = File("/tmp/notes", "cwt")
        file.write(lines.join("\n"))
    end

    function remove(self, idx) begin
        file = File("/tmp/notes", "crw")
        idx = Int(idx)
        state = [0]
        lines = file.read().split("\n").filter(|line| {
            if state[0] == idx -1 begin
                print("Removed index ", idx, "\n")
                state[0] += 1
                return false
            end
            else begin
                state[0] += 1
                return true
            end
        })
        file.close()
        file = File("/tmp/notes", "cwt")
        file.write(lines.join("\n"))
    end

    function list(self) begin
        file = File("/tmp/notes", "r")
        lines = file.read().split("\n")
        for i=0 to lines.length()-1 begin
            line = lines[i]
            print(i+1, ': ', line, '\n')
        end
    end

end

function main() begin
    try
        TodoProgram.start()
    case String as s
        print("Error: ", s, "\n")
    end
end

main()