RTS: Request to Struct
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.