Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/go-pg/urlstruct

urlstruct decodes url.Values into structs
https://github.com/go-pg/urlstruct

go go-pg golang postgresql

Last synced: about 12 hours ago
JSON representation

urlstruct decodes url.Values into structs

Awesome Lists containing this project

README

        

# urlstruct decodes url.Values into structs

[![Build Status](https://travis-ci.org/go-pg/urlstruct.svg?branch=master)](https://travis-ci.org/go-pg/urlstruct)
[![GoDoc](https://godoc.org/github.com/go-pg/urlstruct?status.svg)](https://godoc.org/github.com/go-pg/urlstruct)

## Example

Following example decodes URL query `?page=2&limit=100&author_id=123` into a struct.

```go
type Book struct {
tableName struct{} `pg:"alias:b"`

ID int64
AuthorID int64
CreatedAt time.Time
}

type BookFilter struct {
tableName struct{} `urlstruct:"b"`

urlstruct.Pager
AuthorID int64
}

func ExampleUnmarshal_filter() {
db := pg.Connect(&pg.Options{
User: "postgres",
Password: "",
Database: "postgres",
})
defer db.Close()

values := url.Values{
"author_id": {"123"},
"page": {"2"},
"limit": {"100"},
}
filter := new(BookFilter)
err := urlstruct.Unmarshal(values, filter)
if err != nil {
panic(err)
}

filter.Pager.MaxLimit = 100 // default max limit is 1000
filter.Pager.MaxOffset = 100000 // default max offset is 1000000

// Following query generates:
//
// SELECT "b"."id", "b"."author_id", "b"."created_at"
// FROM "books" AS "b"
// WHERE "b".author_id = 123
// LIMIT 100 OFFSET 100

var books []*Book
_ = db.Model(&books).
WhereStruct(filter).
Limit(filter.Pager.GetLimit()).
Offset(filter.Pager.GetOffset()).
Select()

fmt.Println("author", filter.AuthorID)
fmt.Println("limit", filter.GetLimit())
fmt.Println("offset", filter.GetLimit())
// Output: author 123
// limit 100
// offset 100
}
```