206 lines
5.1 KiB
Markdown
206 lines
5.1 KiB
Markdown
# v-hono
|
|
|
|
A high-performance V language web framework inspired by [Hono.js](https://hono.dev/).
|
|
|
|
## Features
|
|
|
|
- 🚀 **High Performance** - Hybrid routing with LRU cache for optimal speed
|
|
- 🎯 **Simple API** - Clean and intuitive API design inspired by Hono.js
|
|
- 🔧 **Middleware Support** - Flexible middleware system with onion model
|
|
- 📁 **Static File Serving** - Built-in static file server with caching
|
|
- 🔐 **Security** - Path validation and security utilities
|
|
- 📤 **File Upload** - Chunked file upload support
|
|
- 🗄️ **Database** - SQLite integration for data persistence
|
|
- 🔑 **Authentication** - Built-in auth system with JWT-like tokens
|
|
|
|
## Installation
|
|
|
|
### From VPM
|
|
|
|
```bash
|
|
v install meiseayoung.hono
|
|
```
|
|
|
|
### From GitHub
|
|
|
|
```bash
|
|
v install --git https://github.com/meiseayoung/v-hono
|
|
```
|
|
|
|
### Local Development
|
|
|
|
Clone the repository and the module will be available for import:
|
|
|
|
```bash
|
|
git clone https://github.com/meiseayoung/v-hono.git
|
|
cd v-hono
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```v
|
|
import net.http
|
|
import hono
|
|
|
|
fn main() {
|
|
mut app := hono.Hono.new()
|
|
|
|
app.get('/', fn (mut c hono.Context) http.Response {
|
|
return c.text('Hello, World!')
|
|
})
|
|
|
|
app.get('/json', fn (mut c hono.Context) http.Response {
|
|
return c.json('{"message": "Hello, JSON!"}')
|
|
})
|
|
|
|
app.get('/users/:id', fn (mut c hono.Context) http.Response {
|
|
user_id := c.params['id'] or { 'unknown' }
|
|
return c.json('{"user_id": "${user_id}"}')
|
|
})
|
|
|
|
app.listen(':3000')
|
|
}
|
|
```
|
|
|
|
## Middleware
|
|
|
|
```v
|
|
import net.http
|
|
import time
|
|
import hono
|
|
|
|
fn main() {
|
|
mut app := hono.Hono.new()
|
|
|
|
// Logger middleware
|
|
app.use(fn (mut c hono.Context, next fn (mut hono.Context) http.Response) http.Response {
|
|
start := time.now()
|
|
response := next(mut c)
|
|
duration := time.since(start)
|
|
println('[${c.req.method}] ${c.path} - ${duration}')
|
|
return response
|
|
})
|
|
|
|
app.get('/', fn (mut c hono.Context) http.Response {
|
|
return c.text('Hello with middleware!')
|
|
})
|
|
|
|
app.listen(':3000')
|
|
}
|
|
```
|
|
|
|
## Route Grouping
|
|
|
|
```v
|
|
import net.http
|
|
import hono
|
|
|
|
fn main() {
|
|
mut app := hono.Hono.new()
|
|
|
|
// Create API sub-application
|
|
mut api := hono.Hono.new()
|
|
|
|
api.get('/users', fn (mut c hono.Context) http.Response {
|
|
return c.json('[{"id": 1, "name": "Alice"}]')
|
|
})
|
|
|
|
api.get('/users/:id', fn (mut c hono.Context) http.Response {
|
|
user_id := c.params['id'] or { 'unknown' }
|
|
return c.json('{"id": ${user_id}}')
|
|
})
|
|
|
|
// Mount API routes under /api prefix
|
|
app.route('/api', mut api)
|
|
|
|
app.listen(':3000')
|
|
}
|
|
```
|
|
|
|
## Static File Serving
|
|
|
|
```v
|
|
import net.http
|
|
import hono
|
|
|
|
fn main() {
|
|
mut app := hono.Hono.new()
|
|
|
|
// Serve static files from ./public directory
|
|
app.use(hono.serve_static(hono.StaticOptions{
|
|
root: './public'
|
|
path: '/static'
|
|
}))
|
|
|
|
app.listen(':3000')
|
|
}
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### Hono
|
|
|
|
- `Hono.new()` - Create a new Hono application
|
|
- `app.get(path, handler)` - Register GET route
|
|
- `app.post(path, handler)` - Register POST route
|
|
- `app.put(path, handler)` - Register PUT route
|
|
- `app.delete(path, handler)` - Register DELETE route
|
|
- `app.patch(path, handler)` - Register PATCH route
|
|
- `app.all(path, handler)` - Register route for all methods
|
|
- `app.use(middleware)` - Add middleware
|
|
- `app.route(prefix, subapp)` - Mount sub-application
|
|
- `app.listen(port)` - Start server
|
|
|
|
### Context
|
|
|
|
- `c.text(data)` - Return text response
|
|
- `c.json(data)` - Return JSON response
|
|
- `c.html(data)` - Return HTML response
|
|
- `c.file(path)` - Return file response
|
|
- `c.status(code)` - Set response status code
|
|
- `c.params` - Route parameters
|
|
- `c.query` - Query parameters
|
|
- `c.body` - Request body
|
|
- `c.headers` - Response headers
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
v-hono/
|
|
├── app.v # Main application and routing
|
|
├── router.v # Hybrid router implementation
|
|
├── fast_router.v # Fast router with precompiled regex
|
|
├── trie_router.v # Trie-based router
|
|
├── cache.v # LRU cache implementation
|
|
├── request.v # Request context
|
|
├── response.v # Response utilities
|
|
├── static.v # Static file serving
|
|
├── security.v # Security utilities
|
|
├── config.v # Configuration management
|
|
├── logger.v # Logging system
|
|
├── multipart.v # Multipart form parsing
|
|
├── json_parser.v # JSON parsing utilities
|
|
├── upload.v # File upload handling
|
|
├── database.v # Database integration
|
|
├── auth.v # Authentication system
|
|
├── auth_routes.v # Auth route handlers
|
|
├── error_handler.v # Error handling
|
|
├── v.mod # Module definition
|
|
├── README.md # Documentation
|
|
├── examples/ # Example applications
|
|
├── tests/ # Test files
|
|
└── docs/ # Additional documentation
|
|
```
|
|
|
|
## Examples
|
|
|
|
See the `examples/` directory for more examples:
|
|
|
|
- `examples/basic/` - Basic usage
|
|
- `examples/middleware/` - Middleware usage
|
|
- `examples/route_grouping/` - Route grouping
|
|
|
|
## License
|
|
|
|
MIT License
|