-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
102 lines (89 loc) · 2.93 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"encoding/csv"
"flag"
"fmt"
"os"
"unicode/utf8"
"github.com/alecholmes/strava/client"
"github.com/alecholmes/strava/model"
)
func main() {
accessTokenFlag := flag.String("accessToken", "", "access token; required")
afterFlag := flag.Int("afterId", 0, "beginning activity id, exclusive")
segmentsFlag := flag.Bool("segments", false, "print segment details")
delimiterFlag := flag.String("delimiter", ",", "output field delimiter character")
flag.Parse()
if *accessTokenFlag == "" {
flag.Usage()
return
}
delimiter, size := utf8.DecodeRuneInString(*delimiterFlag)
if size == 0 || len(*delimiterFlag) != size {
fmt.Println("Delimiter can only be one character")
flag.Usage()
return
}
client := client.NewClient(*accessTokenFlag)
activitySummaries, err := client.GetActivitySummaries(model.ActivityId(*afterFlag))
if err != nil {
fmt.Fprintf(os.Stderr, "Error getting activity summaries: %s", err)
}
if *segmentsFlag {
activities, err := getActivities(client, activitySummaries)
if err != nil {
fmt.Fprintf(os.Stderr, "Error getting activities: %s", err)
}
printCsv(delimiter, segmentTuples(activities))
} else {
printCsv(delimiter, summaryTuples(activitySummaries))
}
}
func getActivities(client client.Client, summaries []*model.ActivitySummary) ([]*model.Activity, error) {
activityIds := make([]model.ActivityId, len(summaries))
for i, summary := range summaries {
activityIds[i] = summary.Id
}
return client.GetActivities(activityIds)
}
func printCsv(delimiter rune, tuples [][]string) {
writer := csv.NewWriter(os.Stdout)
writer.Comma = delimiter
writer.WriteAll(tuples)
}
func summaryTuples(summaries []*model.ActivitySummary) [][]string {
tuples := make([][]string, len(summaries))
for i, summary := range summaries {
tuple := make([]string, 8)
tuple[0] = fmt.Sprintf("%d", summary.Id)
tuple[1] = summary.Name
tuple[2] = fmt.Sprintf("%.2f", summary.Distance)
tuple[3] = fmt.Sprintf("%.2f", summary.AverageSpeed)
tuple[4] = fmt.Sprintf("%.2f", summary.TotalElevationGain)
tuple[5] = fmt.Sprintf("%d", summary.MovingTime)
tuple[6] = fmt.Sprintf("%d", summary.ElapsedTime)
tuple[7] = summary.StartDate.String()
tuples[i] = tuple
}
return tuples
}
func segmentTuples(activities []*model.Activity) [][]string {
tuples := make([][]string, 0)
for _, activity := range activities {
for _, effort := range activity.SegmentEfforts {
tuple := make([]string, 10)
tuple[0] = fmt.Sprintf("%d", activity.Id)
tuple[1] = activity.Name
tuple[2] = fmt.Sprintf("%d", effort.Id)
tuple[3] = fmt.Sprintf("%d", effort.Segment.Id)
tuple[4] = effort.Segment.Name
tuple[5] = fmt.Sprintf("%.2f", effort.Segment.Distance)
tuple[6] = fmt.Sprintf("%d", effort.Segment.ClimbCategory)
tuple[7] = fmt.Sprintf("%d", effort.ElapsedTime)
tuple[8] = fmt.Sprintf("%d", effort.PrRank)
tuple[9] = effort.StartDate.String()
tuples = append(tuples, tuple)
}
}
return tuples
}