Merge pull request #28 from vssio/add-serve-cmd

Add serve cmd
main
TSURUTA Takumi 2 years ago committed by GitHub
commit 8fdb437483
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,39 +17,6 @@ content, and a little configuration, you can easily build your website!
vss is still under development and the API is not stable. Be aware that vss is still under development and the API is not stable. Be aware that
disruptive changes may be made! disruptive changes may be made!
## Installation
### (Recommended) Install Script
With Shell(For Mac & Linux):
```shell
curl -fsSL https://raw.githubusercontent.com/vssio/vss_install/main/install.sh | sh
```
With PowerShell(for Windows):
```powershell
irm https://raw.githubusercontent.com/vssio/vss_install/main/install.ps1 | iex
```
More information: https://github.com/vssio/vss_install
### Get the binary
Download from [Releases](https://github.com/zztkm/vss/releases)
### Build from source
```
git clone https://github.com/zztkm/vss.git
cd vss
v install markdown
v . -o vss
```
## Usage ## Usage
### Setup contents ### Setup contents
@ -153,3 +120,36 @@ dist
Examples can be found at the Examples can be found at the
[example](https://github.com/zztkm/vss/tree/main/example) directory. [example](https://github.com/zztkm/vss/tree/main/example) directory.
## Installation
### (Recommended) Install Script
With Shell(For Mac & Linux):
```shell
curl -fsSL https://raw.githubusercontent.com/vssio/vss_install/main/install.sh | sh
```
With PowerShell(for Windows):
```powershell
irm https://raw.githubusercontent.com/vssio/vss_install/main/install.ps1 | iex
```
More information: https://github.com/vssio/vss_install
### Get the binary
Download from [Releases](https://github.com/zztkm/vss/releases)
### Build from source
```
git clone https://github.com/zztkm/vss.git
cd vss
v install markdown
v . -o vss
```

@ -0,0 +1,119 @@
module commands
import cli
import log
import net.http
import os
const cport = 8080
fn new_serve_cmd() cli.Command {
return cli.Command{
name: 'serve'
description: 'serve dist'
usage: 'vss serve'
execute: fn (cmd cli.Command) ? {
mut logger := log.Log{}
logger.set_level(log.Level.info)
serve(mut logger) or {
logger.error(err.msg())
println('serve failed')
}
}
}
}
struct MyHttpHandler {
mut:
root string
}
fn normalise_path(path string) string {
cwd := os.getwd() + os.path_separator
mut res := os.abs_path(path).replace(cwd, '').replace(os.path_separator, '/')
return res
}
fn (mut handler MyHttpHandler) handle(req http.Request) http.Response {
mut r := http.Response{
header: req.header
}
// コンテンツを返すための処理
wd := os.getwd()
os_spec_path := req.url.replace('/', os.path_separator)
mut file := wd + os.path_separator + handler.root + os_spec_path
if os.is_dir(file) {
file = file + os.path_separator + 'index.html'
} else {
if !os.is_file(file) {
file = file + '.html'
}
}
html := os.read_file(file) or {
eprintln(err)
r.set_status(.not_found)
r.body = 'Not Found'
r.set_version(req.version)
return r
}
r.body = html
r.set_status(.ok)
r.set_version(req.version)
return r
}
struct Watcher {
path string
mut:
time_stamp i64
}
fn watch(path string, mut logger log.Log) {
mut res := []string{}
os.walk_with_context(path, &res, fn (mut res []string, fpath string) {
res << fpath
})
mut watchers := []Watcher{}
for p in res {
mut w := Watcher{
path: p
time_stamp: os.file_last_mod_unix(p)
}
watchers << w
}
for {
for mut w in watchers {
now := os.file_last_mod_unix(w.path)
if now > w.time_stamp {
println('modified file: $w.path')
w.time_stamp = now
build(mut logger) or {
logger.error(err.msg())
println('Build failed')
}
}
}
}
}
fn serve(mut logger log.Log) ? {
mut handler := MyHttpHandler{
root: 'dist'
}
mut server := &http.Server{
handler: handler
port: commands.cport
}
println('http://localhost:$commands.cport')
w := go watch('dist', mut logger)
server.listen_and_serve() or { panic(err) }
w.wait()
}

@ -6,7 +6,7 @@ import cli
pub fn execute() { pub fn execute() {
mut app := cli.Command{ mut app := cli.Command{
name: 'vss' name: 'vss'
version: '0.0.9' version: '0.0.10'
description: 'static site generator' description: 'static site generator'
execute: fn (cmd cli.Command) ? { execute: fn (cmd cli.Command) ? {
println(cmd.help_message()) println(cmd.help_message())
@ -14,6 +14,7 @@ pub fn execute() {
} }
app.add_command(new_build_cmd()) app.add_command(new_build_cmd())
app.add_command(new_serve_cmd())
app.setup() app.setup()
app.parse(os.args) app.parse(os.args)

Loading…
Cancel
Save