Skip to content

Instantly share code, notes, and snippets.

@lithdew
Created May 19, 2020 11:37
Show Gist options
  • Save lithdew/52e8eab9cc0c3ebab54c513d7f4a86ff to your computer and use it in GitHub Desktop.
Save lithdew/52e8eab9cc0c3ebab54c513d7f4a86ff to your computer and use it in GitHub Desktop.
flatlang: example script
(flatlang.Program) {
Stmts: ([]flatlang.Stmt) (len=10 cap=16) {
(flatlang.Stmt) {
Type: (flatlang.StmtType) Assign,
Name: (string) (len=2) "db",
Exprs: ([]flatlang.Expr) (len=1 cap=1) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.StringNode) {
Val: (string) (len=17) "sqlite://:memory:"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Assign,
Name: (string) (len=9) "all_posts",
Exprs: ([]flatlang.Expr) (len=1 cap=1) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=4 cap=4) {
(flatlang.IdentNode) {
Val: (string) (len=3) "sql"
},
(flatlang.IdentNode) {
Val: (string) (len=2) "db"
},
(flatlang.StringNode) {
Val: (string) (len=47) "select * from posts limit :limit offset :offset"
},
(flatlang.StringNode) {
Val: (string) (len=5) "posts"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Assign,
Name: (string) (len=9) "find_post",
Exprs: ([]flatlang.Expr) (len=1 cap=1) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=4 cap=4) {
(flatlang.IdentNode) {
Val: (string) (len=3) "sql"
},
(flatlang.IdentNode) {
Val: (string) (len=2) "db"
},
(flatlang.StringNode) {
Val: (string) (len=34) "select * from posts where id = :id"
},
(flatlang.StringNode) {
Val: (string) (len=4) "post"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Assign,
Name: (string) (len=8) "new_post",
Exprs: ([]flatlang.Expr) (len=1 cap=1) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=4 cap=4) {
(flatlang.IdentNode) {
Val: (string) (len=3) "sql"
},
(flatlang.IdentNode) {
Val: (string) (len=2) "db"
},
(flatlang.StringNode) {
Val: (string) (len=75) "insert into posts (author, content) values (:author, :content) returning id"
},
(flatlang.StringNode) {
Val: (string) (len=2) "id"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Assign,
Name: (string) (len=13) "expanded_form",
Exprs: ([]flatlang.Expr) (len=1 cap=1) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=3) "sql"
},
(flatlang.MapNode) {
Fields: ([]flatlang.Field) (len=3 cap=4) {
(flatlang.Field) {
Key: (string) (len=2) "db",
Val: (flatlang.IdentNode) {
Val: (string) (len=2) "db"
}
},
(flatlang.Field) {
Key: (string) (len=5) "query",
Val: (flatlang.StringNode) {
Val: (string) (len=47) "select * from posts limit :limit offset :offset"
}
},
(flatlang.Field) {
Key: (string) (len=3) "set",
Val: (flatlang.StringNode) {
Val: (string) (len=5) "posts"
}
}
}
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Assign,
Name: (string) (len=8) "paginate",
Exprs: ([]flatlang.Expr) (len=3 cap=4) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=7) "default"
},
(flatlang.MapNode) {
Fields: ([]flatlang.Field) (len=2 cap=2) {
(flatlang.Field) {
Key: (string) (len=6) "offset",
Val: (flatlang.IntNode) {
Val: (int64) 0
}
},
(flatlang.Field) {
Key: (string) (len=5) "limit",
Val: (flatlang.IntNode) {
Val: (int64) 1024
}
}
}
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=7) "require"
},
(flatlang.MapNode) {
Fields: ([]flatlang.Field) (len=2 cap=2) {
(flatlang.Field) {
Key: (string) (len=6) "offset",
Val: (flatlang.UnaryNode) {
Type: (flatlang.TokenType) >=,
Right: (flatlang.IntNode) {
Val: (int64) 0
}
}
},
(flatlang.Field) {
Key: (string) (len=5) "limit",
Val: (flatlang.BinaryNode) {
Left: (flatlang.UnaryNode) {
Type: (flatlang.TokenType) >=,
Right: (flatlang.IntNode) {
Val: (int64) 0
}
},
Type: (flatlang.TokenType) &,
Right: (flatlang.UnaryNode) {
Type: (flatlang.TokenType) <=,
Right: (flatlang.IntNode) {
Val: (int64) 1024
}
}
}
}
}
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=3) "set"
},
(flatlang.ListNode) {
Items: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.StringNode) {
Val: (string) (len=5) "limit"
},
(flatlang.StringNode) {
Val: (string) (len=6) "offset"
}
}
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Call,
Name: (string) "",
Exprs: ([]flatlang.Expr) (len=4 cap=4) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=3) "get"
},
(flatlang.StringNode) {
Val: (string) (len=6) "/posts"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=8) "paginate"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=9) "find_post"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=6) "encode"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Call,
Name: (string) "",
Exprs: ([]flatlang.Expr) (len=3 cap=4) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=3) "get"
},
(flatlang.StringNode) {
Val: (string) (len=10) "/posts/:id"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=9) "find_post"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=6) "encode"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Call,
Name: (string) "",
Exprs: ([]flatlang.Expr) (len=4 cap=4) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=4) "post"
},
(flatlang.MapNode) {
Fields: ([]flatlang.Field) (len=2 cap=2) {
(flatlang.Field) {
Key: (string) (len=4) "path",
Val: (flatlang.StringNode) {
Val: (string) (len=6) "/posts"
}
},
(flatlang.Field) {
Key: (string) (len=13) "max_body_size",
Val: (flatlang.IntNode) {
Val: (int64) 128
}
}
}
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=6) "decode"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=8) "new_post"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=6) "encode"
}
}
}
}
},
(flatlang.Stmt) {
Type: (flatlang.StmtType) Call,
Name: (string) "",
Exprs: ([]flatlang.Expr) (len=3 cap=4) {
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=3) "get"
},
(flatlang.StringNode) {
Val: (string) (len=7) "/health"
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=2 cap=2) {
(flatlang.IdentNode) {
Val: (string) (len=3) "set"
},
(flatlang.MapNode) {
Fields: ([]flatlang.Field) (len=1 cap=1) {
(flatlang.Field) {
Key: (string) (len=6) "status",
Val: (flatlang.StringNode) {
Val: (string) (len=2) "ok"
}
}
}
}
}
},
(flatlang.Expr) {
Nodes: ([]flatlang.Node) (len=1 cap=1) {
(flatlang.IdentNode) {
Val: (string) (len=6) "encode"
}
}
}
}
}
}
}
// Database URL.
db = 'sqlite://:memory:';
// SQL query handlers.
all_posts = sql db 'select * from posts limit :limit offset :offset' 'posts';
find_post = sql db 'select * from posts where id = :id' 'post';
new_post = sql db 'insert into posts (author, content) values (:author, :content) returning id' 'id';
// An example expanded-form of a SQL query.
expanded_form = sql {db: db, query: 'select * from posts limit :limit offset :offset', set: 'posts'};
// Pagination helper.
paginate =
> default {offset: 0, limit: 1024}
> require {offset: >=0, limit: >=0 & <=1024}
> set ['limit', 'offset'];
// GET "/posts" returns at most 1024 posts.
get "/posts"
> paginate
> find_post
> encode;
// GET "/posts/:id" returns a post with a specific id = ":id".
get "/posts/:id"
> find_post
> encode;
// POST "/posts" creates a new post. Author and content must be provided.
post {path: "/posts", max_body_size: 128}
> decode
> new_post
> encode;
// A simple health check endpoint that returns {status: "ok"}.
get "/health" > set {status: "ok"} > encode;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment