Popularity
2.2
Growing
Activity
0.2
Declining
28
1
2

Programming language: Go
License: MIT License
Tags: Utilities    
Latest version: v1.0.2

tome alternatives and similar packages

Based on the "Utilities" category.
Alternatively, view tome alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of tome or a related project?

Add another 'Utilities' Package

README

Build Status Coverage Status GoDoc Go Report Card GitHub license

Package tome was designed to paginate simple RESTful APIs.

Installation

go get -u github.com/cyruzin/tome

Usage

To get started, import the tome package and initiate the pagination:

import "github.com/cyruzin/tome"

// Post type is a struct for a single post.
type Post struct {
    Title string `json:"title"`
    Body  string `json:"body"`
}

// Posts type is a struct for multiple posts.
type Posts []*Post

// Result type is a struct of posts with pagination.
type Result struct {
    Data *Posts `json:"data"`
    *tome.Chapter
}

// GetPosts gets the latest 10 posts with pagination.
func GetPosts(w http.ResponseWriter, r *http.Request) {
    // Creating a tome chapter with links.
    chapter := &tome.Chapter{
        // Setting base URL.
        BaseURL: "http://yourapi.com/v1/posts",
        // Enabling link results.
        Links: true,
        // Page that you captured in params inside you handler.
        NewPage: 2,
        // Total of pages, this usually comes from a SQL query total rows result.
        TotalResults: model.GetPostsTotalResults(),
    }

    // Paginating the results.
    if err := chapter.Paginate(); err != nil { 
        w.WriteHeader(http.StatusUnprocessableEntity)  // Setting status 422.
            json.NewEncoder(w).Encode(err) // Returning JSON with an error.
        return
    }

    // Here you pass the offset and limit.
    database, err := model.GetPosts(chapter.Offset, chapter.Limit)
    if err != nil {
        w.WriteHeader(http.StatusUnprocessableEntity)  // Setting status 422.
            json.NewEncoder(w).Encode(err) // Returning JSON with an error.
        return
    }

    // Mocking results with pagination.
    res := &Result{Data: database, Chapter: chapter}

    w.WriteHeader(http.StatusOK)  // Setting status 200.
    json.NewEncoder(w).Encode(res) // Returning success JSON.
}

Output:

{
 "data": [
  {
   "title": "What is Lorem Ipsum?",
   "body": "Lorem Ipsum is simply dummy text of the printing and..."
  },
  {
   "title": "Why do we use it?",
   "body": "It is a long established fact that a reader will be..."
  }
 ],
 "base_url": "http://yourapi.com/v1/posts",
 "next_url": "http://yourapi.com/v1/posts?page=3",
 "prev_url": "http://yourapi.com/v1/posts?page=1",
 "per_page": 10,
 "current_page": 2,
 "last_page": 30,
 "total_results": 300
}

Performance

Without links:

Iterations ns/op B/op allocs/op
200000000 7.80 0 0

With links:

Iterations ns/op B/op allocs/op
10000000 133 96 2


*Note that all licence references and agreements mentioned in the tome README section above are relevant to that project's source code only.