core/octclient.go (104 lines of code) (raw):

package core import ( "context" "encoding/json" "fmt" "github.com/shurcooL/githubv4" "math" "sort" "time" ) func NewOctclient(user string, token string) Octclient { return Octclient{ user: user, client: githubv4.NewClient( newOauthClient(token), ), oldestUpdatedAt: time.Now(), latestUpdatedAt: time.Time{}, } } type Octclient struct { user string client *githubv4.Client oldestUpdatedAt time.Time latestUpdatedAt time.Time } func (o *Octclient) callQueryRepositoriesContributedTo(ctx context.Context) (*UserRepositoriesContributedTo, error) { variables := map[string]interface{}{ "login": githubv4.String(o.user), } query := UserRepositoriesContributedTo{} err := o.client.Query(ctx, &query, variables) if err != nil { return nil, err } return &query, nil } func (o *Octclient) updateUpdatedTime(t time.Time) { if o.oldestUpdatedAt.After(t) { o.oldestUpdatedAt = t } if o.latestUpdatedAt.Before(t) { o.latestUpdatedAt = t } } func (o *Octclient) GetRepositoriesContributedTo(ctx context.Context, isSortBySize bool, reverse bool) (*Results, error) { result, err := o.callQueryRepositoriesContributedTo(ctx) if err != nil { return nil, err } var allLanguageSize int languageMap := map[string]int{} for _, node := range result.User.RepositoriesContributedTo.Nodes { o.updateUpdatedTime(node.UpdatedAt.Time) edges := node.Languages.Edges for _, language := range edges { languageMap[string(language.Node.Name)] += int(language.Size) allLanguageSize += int(language.Size) } } var languages []LanguageSize for k, v := range languageMap { languages = append(languages, LanguageSize{ Name: k, Size: v, Percentage: math.Round(float64(v)/float64(allLanguageSize)*10000) / 100, }) } if isSortBySize { sort.Slice(languages, func(i, j int) bool { return languages[i].Size > languages[j].Size }) } if reverse { reverseSlice(languages) } return &Results{ UpdatedRange: UpdatedRange{ Oldest: o.oldestUpdatedAt, Latest: o.latestUpdatedAt, }, LanguageSizes: languages, }, nil } func (*Octclient) ConvertJson(r *Results) (string, error) { jsonWithByte, err := json.MarshalIndent(r, "", " ") return string(jsonWithByte), err } type MarkdownOptions struct { IsEachExtension bool } func (*Octclient) ConvertTableForMarkdown(r *Results, o *MarkdownOptions) string { table := `|language|percentage(%)|size(byte)| |---|---|---| ` for _, v := range r.LanguageSizes { var data string if o.IsEachExtension { data = fmt.Sprintf("|%s|%.2f %%|%d byte|\n", v.Name, v.Percentage, v.Size) } else { data = fmt.Sprintf("|%s|%.2f|%d|\n", v.Name, v.Percentage, v.Size) } table += data } return table }