RTS: Request to Struct
October 29, 2022 ยท View on GitHub
Generate Go structs definitions from JSON server responses.
RTS defines type names using the specified lines in the route file and skipping numbers.
e.g: a request to a route like /users/1/posts generates type UsersPosts
It supports parameters: a line like /users/:user/posts/:pid 1 200 generates type UsersUserPostsPid from the response to the request GET /users/1/posts/200.
RTS supports headers personalization as well, thus it can be used to generate types from responses protected by some authorization method
Install
CLI Application
go get -u github.com/galeone/rts/cmd/rts
CLI Usage
rts [options]
-headers string
Headers to add in every request
-help
prints this help
-insecure
Disables TLS Certificate check for HTTPS, use in case HTTPS Server Certificate is signed by an unknown authority
-out string
Output file. Stdout is used if not specified
-pkg string
Package name (default "main")
-routes string
Routes to request. One per line (default "routes.txt")
-server string
sets the server address (default "http://localhost:9090")
-substruct
Creates types for sub-structs
Examples
You can invoke rts piping from stdin a single JSON (anonymous) and get it converted to a go structure
echo ' {
"Book Id": 30558257,
"Title": "Unsouled (Cradle, #1)",
"Author": "Will Wight",
"Author l-f": "Wight, Will",
"Additional Authors": "",
"BCID": ""
}' | ./rts
obtaining
package main
type Foo1 struct {
Additional_Authors string `json:"Additional Authors"`
Author string `json:"Author"`
Author_l_f string `json:"Author l-f"`
Bcid string `json:"BCID"`
Book_Id int64 `json:"Book Id"`
Title string `json:"Title"`
}
Or you can define a more complex scenario, definining the routes.txt file with a line for each (parametric) request and use it as shown below.
routes.txt:
/
/repos/:user/:repo galeone igor
Run:
rts -server https://api.github.com -pkg example
Returns:
package example
type Foo1 struct {
AuthorizationsURL string `json:"authorizations_url"`
CodeSearchURL string `json:"code_search_url"`
CommitSearchURL string `json:"commit_search_url"`
CurrentUserAuthorizationsHTMLURL string `json:"current_user_authorizations_html_url"`
CurrentUserRepositoriesURL string `json:"current_user_repositories_url"`
CurrentUserURL string `json:"current_user_url"`
EmailsURL string `json:"emails_url"`
EmojisURL string `json:"emojis_url"`
EventsURL string `json:"events_url"`
FeedsURL string `json:"feeds_url"`
FollowersURL string `json:"followers_url"`
FollowingURL string `json:"following_url"`
GistsURL string `json:"gists_url"`
HubURL string `json:"hub_url"`
IssueSearchURL string `json:"issue_search_url"`
IssuesURL string `json:"issues_url"`
KeysURL string `json:"keys_url"`
LabelSearchURL string `json:"label_search_url"`
NotificationsURL string `json:"notifications_url"`
OrganizationRepositoriesURL string `json:"organization_repositories_url"`
OrganizationTeamsURL string `json:"organization_teams_url"`
OrganizationURL string `json:"organization_url"`
PublicGistsURL string `json:"public_gists_url"`
RateLimitURL string `json:"rate_limit_url"`
RepositorySearchURL string `json:"repository_search_url"`
RepositoryURL string `json:"repository_url"`
StarredGistsURL string `json:"starred_gists_url"`
StarredURL string `json:"starred_url"`
TopicSearchURL string `json:"topic_search_url"`
UserOrganizationsURL string `json:"user_organizations_url"`
UserRepositoriesURL string `json:"user_repositories_url"`
UserSearchURL string `json:"user_search_url"`
UserURL string `json:"user_url"`
}
type ReposUserRepo struct {
AllowForking bool `json:"allow_forking"`
ArchiveURL string `json:"archive_url"`
Archived bool `json:"archived"`
AssigneesURL string `json:"assignees_url"`
BlobsURL string `json:"blobs_url"`
BranchesURL string `json:"branches_url"`
CloneURL string `json:"clone_url"`
CollaboratorsURL string `json:"collaborators_url"`
CommentsURL string `json:"comments_url"`
CommitsURL string `json:"commits_url"`
CompareURL string `json:"compare_url"`
ContentsURL string `json:"contents_url"`
ContributorsURL string `json:"contributors_url"`
CreatedAt string `json:"created_at"`
DefaultBranch string `json:"default_branch"`
DeploymentsURL string `json:"deployments_url"`
Description string `json:"description"`
Disabled bool `json:"disabled"`
DownloadsURL string `json:"downloads_url"`
EventsURL string `json:"events_url"`
Fork bool `json:"fork"`
Forks int64 `json:"forks"`
ForksCount int64 `json:"forks_count"`
ForksURL string `json:"forks_url"`
FullName string `json:"full_name"`
GitCommitsURL string `json:"git_commits_url"`
GitRefsURL string `json:"git_refs_url"`
GitTagsURL string `json:"git_tags_url"`
GitURL string `json:"git_url"`
HasDownloads bool `json:"has_downloads"`
HasIssues bool `json:"has_issues"`
HasPages bool `json:"has_pages"`
HasProjects bool `json:"has_projects"`
HasWiki bool `json:"has_wiki"`
Homepage string `json:"homepage"`
HooksURL string `json:"hooks_url"`
HTMLURL string `json:"html_url"`
ID int64 `json:"id"`
IsTemplate bool `json:"is_template"`
IssueCommentURL string `json:"issue_comment_url"`
IssueEventsURL string `json:"issue_events_url"`
IssuesURL string `json:"issues_url"`
KeysURL string `json:"keys_url"`
LabelsURL string `json:"labels_url"`
Language string `json:"language"`
LanguagesURL string `json:"languages_url"`
License ReposUserRepo_sub1 `json:"license"`
MergesURL string `json:"merges_url"`
MilestonesURL string `json:"milestones_url"`
MirrorURL interface{} `json:"mirror_url"`
Name string `json:"name"`
NetworkCount int64 `json:"network_count"`
NodeID string `json:"node_id"`
NotificationsURL string `json:"notifications_url"`
OpenIssues int64 `json:"open_issues"`
OpenIssuesCount int64 `json:"open_issues_count"`
Owner ReposUserRepo_sub2 `json:"owner"`
Private bool `json:"private"`
PullsURL string `json:"pulls_url"`
PushedAt string `json:"pushed_at"`
ReleasesURL string `json:"releases_url"`
Size int64 `json:"size"`
SSHURL string `json:"ssh_url"`
StargazersCount int64 `json:"stargazers_count"`
StargazersURL string `json:"stargazers_url"`
StatusesURL string `json:"statuses_url"`
SubscribersCount int64 `json:"subscribers_count"`
SubscribersURL string `json:"subscribers_url"`
SubscriptionURL string `json:"subscription_url"`
SvnURL string `json:"svn_url"`
TagsURL string `json:"tags_url"`
TeamsURL string `json:"teams_url"`
TempCloneToken interface{} `json:"temp_clone_token"`
Topics []string `json:"topics"`
TreesURL string `json:"trees_url"`
UpdatedAt string `json:"updated_at"`
URL string `json:"url"`
Visibility string `json:"visibility"`
Watchers int64 `json:"watchers"`
WatchersCount int64 `json:"watchers_count"`
WebCommitSignoffRequired bool `json:"web_commit_signoff_required"`
}
type ReposUserRepo_sub2 struct {
AvatarURL string `json:"avatar_url"`
EventsURL string `json:"events_url"`
FollowersURL string `json:"followers_url"`
FollowingURL string `json:"following_url"`
GistsURL string `json:"gists_url"`
GravatarID string `json:"gravatar_id"`
HTMLURL string `json:"html_url"`
ID int64 `json:"id"`
Login string `json:"login"`
NodeID string `json:"node_id"`
OrganizationsURL string `json:"organizations_url"`
ReceivedEventsURL string `json:"received_events_url"`
ReposURL string `json:"repos_url"`
SiteAdmin bool `json:"site_admin"`
StarredURL string `json:"starred_url"`
SubscriptionsURL string `json:"subscriptions_url"`
Type string `json:"type"`
URL string `json:"url"`
}
type ReposUserRepo_sub1 struct {
Key string `json:"key"`
Name string `json:"name"`
NodeID string `json:"node_id"`
SpdxID string `json:"spdx_id"`
URL string `json:"url"`
}
Library
import "github.com/galeone/rts"
byteFile, err := rts.Do(pkg, server, lines, headerMap)
License
RTS: Request to Struct. Generates Go structs from a server response. Copyright (C) 2016-2022 Paolo Galeone nessuno@nerdz.eu
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. Exhibit B is not attached; this software is compatible with the licenses expressed under Section 1.12 of the MPL v2.