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

Add serve cmd
This commit is contained in:
TSURUTA Takumi 2022-09-13 04:51:18 +09:00 committed by GitHub
commit 8fdb437483
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 154 additions and 34 deletions

View file

@ -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
```

119
commands/serve.v Normal file
View file

@ -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()
}

View file

@ -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)