diff --git a/cmd/cmd_media_search.go b/cmd/cmd_media_search.go index 17a224d..f7980e6 100644 --- a/cmd/cmd_media_search.go +++ b/cmd/cmd_media_search.go @@ -13,57 +13,6 @@ import ( var pageSize int var searchMediaType string -// func getMediaSearch(searchQuery string) { -// CheckIfTokenExists() - -// if pageSize < 0 || pageSize > 50 { -// fmt.Println("page count must be lesser than 50 and greater than 0") -// os.Exit(0) -// } - -// mediaSearch := internal.NewMediaSearch() -// err := mediaSearch.Get(searchQuery, searchMediaType, pageSize) -// if err != nil { -// ErrorMessage(err.Error()) -// } -// rows := [][]string{} - -// for _, i := range mediaSearch.Data.Page.Media { -// rows = append(rows, []string{ -// strconv.Itoa(i.Id), -// i.Title.UserPreferred, -// fmt.Sprintf("%.2f", i.AverageScore), -// }) -// } - -// // get size of terminal -// tw, _, err := term.GetSize((os.Stdout.Fd())) -// if err != nil { -// ErrorMessage(err.Error()) -// } - -// t := table.New(). -// Border(lipgloss.RoundedBorder()). -// BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("99"))). -// StyleFunc(func(row, col int) lipgloss.Style { -// // style for table header row -// if row == -1 { -// return lipgloss.NewStyle().Foreground(lipgloss.Color("99")).Bold(true).Align(lipgloss.Center) -// } - -// // force title column to wrap by specifying terminal width -// if col == 1 { -// return lipgloss.NewStyle().Align(lipgloss.Center).PaddingLeft(2).PaddingRight(2).Width(tw) -// } - -// return lipgloss.NewStyle().Align(lipgloss.Center).PaddingLeft(2).PaddingRight(2) -// }). -// Headers("ID", "TITLE", "SCORE"). -// Rows(rows...).Width(tw) - -// fmt.Println(t) -// } - func handleMediaSearch(cmd *cobra.Command, args []string) { if len(args) == 0 { fmt.Println("No seach queries provided") diff --git a/go.mod b/go.mod index 0d33ce6..0d2cc10 100644 --- a/go.mod +++ b/go.mod @@ -4,52 +4,37 @@ go 1.24.0 require ( github.com/charmbracelet/fang v0.1.0 - github.com/charmbracelet/huh v0.7.0 - github.com/charmbracelet/huh/spinner v0.0.0-20250603124601-31a1db2cbc39 github.com/charmbracelet/lipgloss v1.1.0 github.com/spf13/cobra v1.9.1 - modernc.org/sqlite v1.38.0 + github.com/zalando/go-keyring v0.2.6 ) require ( - github.com/atotto/clipboard v0.1.4 // indirect + al.essio.dev/pkg/shellescape v1.5.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect - github.com/catppuccin/go v0.3.0 // indirect - github.com/charmbracelet/bubbles v0.21.0 // indirect - github.com/charmbracelet/bubbletea v1.3.5 // indirect github.com/charmbracelet/colorprofile v0.3.1 // indirect github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 // indirect github.com/charmbracelet/x/ansi v0.9.3 // indirect github.com/charmbracelet/x/cellbuf v0.0.13 // indirect github.com/charmbracelet/x/exp/charmtone v0.0.0-20250616121729-19b66ab4499b // indirect - github.com/charmbracelet/x/exp/strings v0.0.0-20250616121729-19b66ab4499b // indirect + github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 // indirect github.com/charmbracelet/x/term v0.2.1 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect - github.com/google/uuid v1.6.0 // indirect + github.com/danieljoos/wincred v1.2.2 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect - github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/mango v0.2.0 // indirect github.com/muesli/mango-cobra v1.2.0 // indirect github.com/muesli/mango-pflag v0.1.0 // indirect github.com/muesli/roff v0.1.0 // indirect github.com/muesli/termenv v0.16.0 // indirect - github.com/ncruces/go-strftime v0.1.9 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/sync v0.15.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/text v0.26.0 // indirect - modernc.org/libc v1.66.0 // indirect - modernc.org/mathutil v1.7.1 // indirect - modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index c08dfdc..9abf912 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,13 @@ -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= -github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= +al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= -github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY= -github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= -github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= -github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= -github.com/charmbracelet/bubbletea v1.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc= -github.com/charmbracelet/bubbletea v1.3.5/go.mod h1:TkCnmH+aBd4LrXhXcqrKiYwRs7qyQx5rBgH5fVY3v54= github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40= github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0= github.com/charmbracelet/fang v0.1.0 h1:SlZS2crf3/zQh7Mr4+W+7QR1k+L08rrPX5rm5z3d7Wg= github.com/charmbracelet/fang v0.1.0/go.mod h1:Zl/zeUQ8EtQuGyiV0ZKZlZPDowKRTzu8s/367EpN/fc= -github.com/charmbracelet/huh v0.7.0 h1:W8S1uyGETgj9Tuda3/JdVkc3x7DBLZYPZc4c+/rnRdc= -github.com/charmbracelet/huh v0.7.0/go.mod h1:UGC3DZHlgOKHvHC07a5vHag41zzhpPFj34U92sOmyuk= -github.com/charmbracelet/huh/spinner v0.0.0-20250603124601-31a1db2cbc39 h1:y16+KWI/sogZRV2VfsJVOH492ky8LspmGZHzblk9Zbw= -github.com/charmbracelet/huh/spinner v0.0.0-20250603124601-31a1db2cbc39/go.mod h1:w0OZxAh6dZFba5kSXHRnagqYAsSUKrxBtPkz0zWoGTo= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0QmhKXbcb3jY0ZIKU= @@ -28,49 +16,29 @@ github.com/charmbracelet/x/ansi v0.9.3 h1:BXt5DHS/MKF+LjuK4huWrC6NCvHtexww7dMayh github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= -github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U= -github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ= -github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86 h1:JSt3B+U9iqk37QUU2Rvb6DSBYRLtWqFqfxf8l5hOZUA= -github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0= github.com/charmbracelet/x/exp/charmtone v0.0.0-20250616121729-19b66ab4499b h1:Kz9OEed9DfdHqN8Z7TTUyOpqsQ2GVQS0gAN4ZyBdT2w= github.com/charmbracelet/x/exp/charmtone v0.0.0-20250616121729-19b66ab4499b/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0= github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ= github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/charmbracelet/x/exp/strings v0.0.0-20250616121729-19b66ab4499b h1:bJ9sY6E78h/kZ+pY40khYMNTC/S+vzRAwJTZqyVoOyQ= -github.com/charmbracelet/x/exp/strings v0.0.0-20250616121729-19b66ab4499b/go.mod h1:Rgw3/F+xlcUc5XygUtimVSxAqCOsqyvJjqF5UHRvc5k= github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= -github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= -github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= -github.com/charmbracelet/x/xpty v0.1.2 h1:Pqmu4TEJ8KeA9uSkISKMU3f+C1F6OGBn8ABuGlqCbtI= -github.com/charmbracelet/x/xpty v0.1.2/go.mod h1:XK2Z0id5rtLWcpeNiMYBccNNBrP2IJnzHI0Lq13Xzq4= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= -github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= +github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= +github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= -github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= -github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= -github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= -github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/mango v0.2.0 h1:iNNc0c5VLQ6fsMgAqGQofByNUBH2Q2nEbD6TaI+5yyQ= @@ -83,12 +51,8 @@ github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= -github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= -github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -97,50 +61,21 @@ github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s= +github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s= -modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= -modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU= -modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE= -modernc.org/fileutil v1.3.3 h1:3qaU+7f7xxTUmvU1pJTZiDLAIoJVdUSSauJNHg9yXoA= -modernc.org/fileutil v1.3.3/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= -modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= -modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/goabi0 v0.0.3 h1:y81b9r3asCh6Xtse6Nz85aYGB0cG3M3U6222yap1KWI= -modernc.org/goabi0 v0.0.3/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= -modernc.org/libc v1.66.0 h1:eoFuDb1ozurUY5WSWlgvxHp0FuL+AncMwNjFqGYMJPQ= -modernc.org/libc v1.66.0/go.mod h1:AiZxInURfEJx516LqEaFcrC+X38rt9G7+8ojIXQKHbo= -modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= -modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= -modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= -modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= -modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= -modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= -modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.38.0 h1:+4OrfPQ8pxHKuWG4md1JpR/EYAh3Md7TdejuuzE7EUI= -modernc.org/sqlite v1.38.0/go.mod h1:1Bj+yES4SVvBZ4cBOpVZ6QgesMCKpJZDq0nxYzOpmNE= -modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= -modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/internal/api/anilist.go b/internal/api/anilist.go index 443610c..02eb3a3 100644 --- a/internal/api/anilist.go +++ b/internal/api/anilist.go @@ -10,7 +10,7 @@ import ( "github.com/CosmicPredator/chibi/internal" "github.com/CosmicPredator/chibi/internal/api/responses" - "github.com/CosmicPredator/chibi/internal/db" + "github.com/CosmicPredator/chibi/internal/credstore" ) // Helper function to parse query string and variable map @@ -32,13 +32,7 @@ func queryAnilist(query string, variables map[string]any) ([]byte, error) { return nil, err } - dbConn, err := db.NewDbConn(false) - if err != nil { - return nil, err - } - defer dbConn.Close() - - token, err := dbConn.GetConfig("auth_token") + token, err := credstore.GetCredential("auth_token") if err != nil { return nil, errors.New("not logged in. Please use \"chibi login\" to continue") } diff --git a/internal/credstore/keyring.go b/internal/credstore/keyring.go new file mode 100644 index 0000000..118b23a --- /dev/null +++ b/internal/credstore/keyring.go @@ -0,0 +1,20 @@ +package credstore + +import "github.com/zalando/go-keyring" + +var SRV_NAME = "chibi" + +// add a key value pair to config table +func SetCredential(key string, value string) error { + err := keyring.Set(SRV_NAME, key, value) + return err +} + +func GetCredential(key string) (*string, error) { + value, err := keyring.Get(SRV_NAME, key) + return &value, err +} + +func DeleteCredentials() error { + return keyring.DeleteAll(SRV_NAME) +} \ No newline at end of file diff --git a/internal/db/db.go b/internal/db/db.go deleted file mode 100644 index 7142cda..0000000 --- a/internal/db/db.go +++ /dev/null @@ -1,112 +0,0 @@ -package db - -import ( - "database/sql" - "os" - "path" - - "github.com/CosmicPredator/chibi/internal" - _ "modernc.org/sqlite" -) - -type DbContext struct { - dbConn *sql.DB -} - -// creates required SQL tables -func (dc *DbContext) createRequiredTables() error { - tx, err := dc.dbConn.Begin() - if err != nil { - return err - } - - if _, err = tx.Exec(QUERY_CREATE_TABLE); err != nil { - return err - } - - if err = tx.Commit(); err != nil { - tx.Rollback() - return err - } - return nil -} - -// initialize an SQL instance. -// if isFirstTime is true, it'll clean the os config dir -// and creates a brand new table -func (dc *DbContext) init(isFirstTime bool) error { - osConfigPath, _ := os.UserConfigDir() - configDir := path.Join(osConfigPath, "chibi") - - if isFirstTime { - internal.CreateConfigDir() - } - dbPath := path.Join(configDir, internal.DB_NAME) - - db, err := sql.Open("sqlite", dbPath) - if err != nil { - return err - } - dc.dbConn = db - if isFirstTime { - err := dc.createRequiredTables() - if err != nil { - return err - } - } - return nil -} - -// add a key value pair to config table -func (dc *DbContext) SetConfig(key string, value string) error { - tx, err := dc.dbConn.Begin() - if err != nil { - return err - } - - if _, err = tx.Exec(QUERY_INSERT_CONFIG, key, value); err != nil { - return err - } - - if err = tx.Commit(); err != nil { - tx.Rollback() - return err - } - - return nil -} - -// gets a key's value from the config table -func (dc *DbContext) GetConfig(key string) (*string, error) { - tx, err := dc.dbConn.Begin() - if err != nil { - return nil, err - } - - row := tx.QueryRow(QUERY_GET_CONFIG, key) - var value string - - if err = row.Scan(&value); err != nil { - return nil, err - } - - if err = tx.Commit(); err != nil { - return nil, err - } - return &value, nil -} - -// closes the DB instance after usage -func (dc *DbContext) Close() { - dc.dbConn.Close() -} - -// returns a brand new DbContext instance -func NewDbConn(isFirstTime bool) (*DbContext, error) { - dbContext := DbContext{} - err := dbContext.init(isFirstTime) - if err != nil { - return nil, err - } - return &dbContext, nil -} diff --git a/internal/db/queries.go b/internal/db/queries.go deleted file mode 100644 index c257573..0000000 --- a/internal/db/queries.go +++ /dev/null @@ -1,15 +0,0 @@ -// This package consists of all SqLite DB Query string used by chibi - -package db - -const ( - QUERY_CREATE_TABLE = `CREATE TABLE IF NOT EXISTS config ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - key TEXT NOT NULL, - value TEXT - )` - - QUERY_INSERT_CONFIG = `INSERT INTO config (key, value) VALUES (?, ?)` - - QUERY_GET_CONFIG = `SELECT value FROM config WHERE key = ?` -) diff --git a/internal/helpers.go b/internal/helpers.go index 50b2f1b..66d9728 100644 --- a/internal/helpers.go +++ b/internal/helpers.go @@ -2,23 +2,9 @@ package internal import ( "os" - "path" + "strings" ) -// creates a directory "chibi" in os specific config folder. -// in unix-like systems, the path is /home/user/.config/chibi. -// in windows, the path is %AppData%\chibi -func CreateConfigDir() { - osConfigPath, _ := os.UserConfigDir() - configDir := path.Join(osConfigPath, "chibi") - _, err := os.Stat(configDir) - - if err == nil { - os.RemoveAll(configDir) - } - os.MkdirAll(configDir, 0755) -} - // maps "type" command line argument string to valid // MediaType enum required by AniList API func MediaTypeEnumMapper(mediaType string) string { @@ -75,3 +61,31 @@ func MediaFormatFormatter(mediaFormat string) string { return "?" } } + +func CanSupportKittyGP() bool { + term := os.Getenv("TERM") + termProgram := os.Getenv("TERM_PROGRAM") + konsoleVersion := os.Getenv("KONSOLE_VERSION") + + if strings.Contains(strings.ToLower(term), "ghostty") { + return true + } + if konsoleVersion != "" { + return true + } + if strings.HasPrefix(strings.ToLower(term), "xterm-kitty") { + return true + } + if strings.Contains(strings.ToLower(termProgram), "warp") { + return true + } + if strings.Contains(strings.ToLower(term), "wayst") { + return true + } + if strings.Contains(strings.ToLower(termProgram), "wezterm") || + strings.Contains(strings.ToLower(term), "wezterm") { + return true + } + + return false +} \ No newline at end of file diff --git a/internal/ui/image_renderer.go b/internal/ui/image_renderer.go index 462bee6..4259a08 100644 --- a/internal/ui/image_renderer.go +++ b/internal/ui/image_renderer.go @@ -10,11 +10,12 @@ import ( "io" "net/http" "os" + + "github.com/CosmicPredator/chibi/internal" ) func convertToPNG(jpgData []byte) ([]byte, error) { img, _, err := image.Decode(bytes.NewReader(jpgData)) - //resized := resize.Resize(220, 300, img, resize.Lanczos3) if err != nil { return nil, err @@ -85,6 +86,7 @@ type KGPParams struct { } func RenderWithImage(imageUrl string, content string, kgpParams KGPParams, numLines int) error { + resp, err := http.Get(imageUrl) if err != nil { panic(err) @@ -112,10 +114,11 @@ func RenderWithImage(imageUrl string, content string, kgpParams KGPParams, numLi fmt.Print("\n") fmt.Println(content) - fmt.Printf("\033[%dA\033[2C", numLines) - - writeChunked(cmd, pngData) - fmt.Print("\n") + if internal.CanSupportKittyGP() { + fmt.Printf("\033[%dA\033[2C", numLines) + writeChunked(cmd, pngData) + fmt.Print("\n") + } return nil } \ No newline at end of file diff --git a/internal/ui/login.go b/internal/ui/login.go index 13ac794..9b71252 100644 --- a/internal/ui/login.go +++ b/internal/ui/login.go @@ -4,8 +4,6 @@ import ( "errors" "fmt" "strings" - - "github.com/charmbracelet/huh" ) type LoginUI struct { @@ -33,16 +31,19 @@ func (l *LoginUI) Render() error { fmt.Print(sb.String()) // display token entry form - err := huh.NewText(). - Title("Paste your token here"). - Value(&l.token). - CharLimit(2000). - Validate(func(s string) error { + for { + data, err := PrettyInput("Paste your token here", "", func(s string) error { if s == "" { return errors.New("please provide a valid token") } return nil - }). - Run() - return err + }) + if err != nil { + fmt.Println(ErrorText(err)) + continue + } + l.token = data + break + } + return nil } diff --git a/internal/ui/profile.go b/internal/ui/profile.go index de633a0..b860106 100644 --- a/internal/ui/profile.go +++ b/internal/ui/profile.go @@ -5,6 +5,7 @@ import ( "strconv" "strings" + "github.com/CosmicPredator/chibi/internal" "github.com/charmbracelet/lipgloss" ) @@ -58,23 +59,33 @@ func (p *ProfileUI) Render() error { // iterating over dataSlice and adding the KV pairs to String Builder // with appropriate padding for _, kv := range dataSlice { - sb.WriteString( - fmt.Sprintf( - "%*s%s : %s\n", - 20, "", - keyStyle.MarginRight(maxKeyLen-len(kv.Key)).Render(kv.Key), - valueStyle.Render(kv.Value), - ), - ) + if internal.CanSupportKittyGP() { + sb.WriteString( + fmt.Sprintf( + "%*s%s : %s\n", + 20, "", + keyStyle.MarginRight(maxKeyLen-len(kv.Key)).Render(kv.Key), + valueStyle.Render(kv.Value), + ), + ) + } else { + sb.WriteString( + fmt.Sprintf( + "%s : %s\n", + keyStyle.MarginRight(maxKeyLen-len(kv.Key)).Render(kv.Key), + valueStyle.Render(kv.Value), + ), + ) + } } // Display the output - RenderWithImage( - p.AvatarUrl, - sb.String(), + err := RenderWithImage( + p.AvatarUrl, + sb.String(), KGPParams{ R: "7", C: "15", - },8) - return nil + }, 8) + return err } diff --git a/internal/ui/styles.go b/internal/ui/styles.go index 4db4b21..bce822a 100644 --- a/internal/ui/styles.go +++ b/internal/ui/styles.go @@ -2,8 +2,9 @@ package ui import ( "context" + "fmt" + "time" - "github.com/charmbracelet/huh/spinner" "github.com/charmbracelet/lipgloss" ) @@ -35,10 +36,62 @@ func HighlightedText(msg string) string { // displays spinner while the supplied action // func is getting executed +// func ActionSpinner(title string, action func(context.Context) error) error { +// return spinner. +// New(). +// Title(title). +// ActionWithErr(action). +// Run() +// } + func ActionSpinner(title string, action func(context.Context) error) error { - return spinner. - New(). - Title(title). - ActionWithErr(action). - Run() + done := make(chan bool) + go func() { + spinnerStyle := lipgloss. + NewStyle(). + Foreground(lipgloss.ANSIColor(5)) + dots := []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"} + var styledDots []string = make([]string, 0) + for _, character := range dots { + styledDots = append(styledDots, spinnerStyle.Render(character)) + } + i := 0 + for { + select { + case <-done: + fmt.Print("\r\033[K") + return + default: + fmt.Printf("\r%s %s", styledDots[i], title) + time.Sleep(150 * time.Millisecond) + i = (i + 1) % len(dots) + } + } + }() + err := action(context.TODO()) + done <- true + return err } + +func PrettyInput(title, defaultVal string, validatorFunc func(s string) error) (string, error) { + if defaultVal == "" { + defaultVal = "none" + } + formattedTitle := lipgloss. + NewStyle(). + Foreground(lipgloss.ANSIColor(5)). + Bold(true). + Render(title) + + formattedDefaultVal := lipgloss. + NewStyle(). + Foreground(lipgloss.ANSIColor(1)). + Bold(true). + Render(fmt.Sprintf("Default: %s", defaultVal)) + prompt := fmt.Sprintf("%s (%s): ", formattedTitle, formattedDefaultVal) + fmt.Print(prompt) + var value string + fmt.Scanln(&value) + err := validatorFunc(value) + return value, err +} \ No newline at end of file diff --git a/internal/viewmodel/login_handler.go b/internal/viewmodel/login_handler.go index b9635df..d33cb34 100644 --- a/internal/viewmodel/login_handler.go +++ b/internal/viewmodel/login_handler.go @@ -8,7 +8,7 @@ import ( "github.com/CosmicPredator/chibi/internal" "github.com/CosmicPredator/chibi/internal/api" "github.com/CosmicPredator/chibi/internal/api/responses" - "github.com/CosmicPredator/chibi/internal/db" + "github.com/CosmicPredator/chibi/internal/credstore" "github.com/CosmicPredator/chibi/internal/ui" ) @@ -22,14 +22,8 @@ func HandleLogin() error { return err } - dbConn, err := db.NewDbConn(true) - if err != nil { - return err - } - defer dbConn.Close() - // write access token to db - err = dbConn.SetConfig("auth_token", loginUI.GetAuthToken()) + err = credstore.SetCredential("auth_token", loginUI.GetAuthToken()) if err != nil { return err } @@ -45,12 +39,12 @@ func HandleLogin() error { return err } - err = dbConn.SetConfig("user_id", strconv.Itoa(profile.Data.Viewer.Id)) + err = credstore.SetCredential("user_id", strconv.Itoa(profile.Data.Viewer.Id)) if err != nil { return err } - err = dbConn.SetConfig("user_name", profile.Data.Viewer.Name) + err = credstore.SetCredential("user_name", profile.Data.Viewer.Name) if err != nil { return err } diff --git a/internal/viewmodel/logout_handler.go b/internal/viewmodel/logout_handler.go index c625f6c..8f739d0 100644 --- a/internal/viewmodel/logout_handler.go +++ b/internal/viewmodel/logout_handler.go @@ -2,9 +2,8 @@ package viewmodel import ( "fmt" - "os" - "path" + "github.com/CosmicPredator/chibi/internal/credstore" "github.com/CosmicPredator/chibi/internal/ui" ) @@ -13,20 +12,10 @@ import ( // TODO: Implement proper logout operations func HandleLogout() error { - osConfigPath, _ := os.UserConfigDir() - configDir := path.Join(osConfigPath, "chibi") - - _, err := os.Stat(configDir) - if err != nil { - ui.HighlightedText("Already logged out.") - return nil - } - - err = os.RemoveAll(configDir) + err := credstore.DeleteCredentials() if err != nil { return err } - fmt.Println(ui.SuccessText("Logged out successfully!")) return nil } \ No newline at end of file diff --git a/internal/viewmodel/media_list_handler.go b/internal/viewmodel/media_list_handler.go index 9769a7c..de865c9 100644 --- a/internal/viewmodel/media_list_handler.go +++ b/internal/viewmodel/media_list_handler.go @@ -2,12 +2,13 @@ package viewmodel import ( "context" + "errors" "strconv" "github.com/CosmicPredator/chibi/internal" "github.com/CosmicPredator/chibi/internal/api" "github.com/CosmicPredator/chibi/internal/api/responses" - "github.com/CosmicPredator/chibi/internal/db" + "github.com/CosmicPredator/chibi/internal/credstore" "github.com/CosmicPredator/chibi/internal/ui" ) @@ -17,13 +18,9 @@ func HandleMediaList(mediaType, mediaStatus string) error { mediaStatus = internal.MediaStatusEnumMapper(mediaStatus) // get user id - dbCtx, err := db.NewDbConn(false) + userId, err := credstore.GetCredential("user_id") if err != nil { - return err - } - userId, err := dbCtx.GetConfig("user_id") - if err != nil { - return err + return errors.New("not logged in. Please use \"chibi login\" to continue") } userIdInt, err := strconv.Atoi(*userId) diff --git a/internal/viewmodel/media_update_handler.go b/internal/viewmodel/media_update_handler.go index f8d43ba..fe90ddb 100644 --- a/internal/viewmodel/media_update_handler.go +++ b/internal/viewmodel/media_update_handler.go @@ -10,10 +10,8 @@ import ( "github.com/CosmicPredator/chibi/internal" "github.com/CosmicPredator/chibi/internal/api" "github.com/CosmicPredator/chibi/internal/api/responses" - "github.com/CosmicPredator/chibi/internal/db" + "github.com/CosmicPredator/chibi/internal/credstore" "github.com/CosmicPredator/chibi/internal/ui" - "github.com/charmbracelet/huh" - "github.com/charmbracelet/huh/spinner" ) type MediaUpdateParams struct { @@ -32,12 +30,13 @@ func getCurrentProgress(userId int, mediaId int) (current int, total *int, err e var mediaList *responses.MediaList // load medialist collection - err = spinner.New().Title("Getting your list...").Action(func() { + err = ui.ActionSpinner("Getting your list...", func(ctx context.Context) error { mediaList, err = api.GetMediaList( userId, []string{"CURRENT", "REPEATING"}, ) - }).Run() + return err + }) if err != nil { return @@ -134,44 +133,59 @@ func handleNewAdditionAction(params MediaUpdateParams) error { // this func gets invoked when the current progress // matches the total progress func handleMediaCompletedAction(params MediaUpdateParams, progress int) error { - currDate := fmt.Sprintf("%d/%02d/%d\n", time.Now().Day(), time.Now().Month(), time.Now().Year()) + defaultDate := fmt.Sprintf("%d/%02d/%d", time.Now().Day(), time.Now().Month(), time.Now().Year()) + var currDate string var scoreString string var notes string - // display a series of huh! forms + // display a series of forms // 1. Completed Data + for { + input, err := ui.PrettyInput("Completed Date", defaultDate, func(s string) error { + if strings.TrimSpace(s) == "" { + return nil + } + layout := "02/01/2006" + _, err := time.Parse(layout, strings.TrimSpace(s)) + return err + }) + if err != nil { + fmt.Println(ui.ErrorText(err)) + continue + } + currDate = strings.TrimSpace(input) + if currDate == "" { + currDate = defaultDate + } + break + } + // 2. Notes + for { + input, err := ui.PrettyInput("Notes", "", func(s string) error { + return nil + }) + if err != nil { + fmt.Println(ui.ErrorText(err)) + continue + } + notes = input + break + } + // 3. Score - huh.NewForm( - huh.NewGroup( - huh.NewInput(). - Title("Completed Date"). - Value(&currDate). - Description("Date should be in format DD/MM/YYYY"). - Validate(func(s string) error { - layout := "02/01/2006" - _, err := time.Parse(layout, strings.TrimSpace(s)) - return err - }), - ), - huh.NewGroup( - huh.NewText(). - Title("Notes"). - Description("Note: you can add multiple lines"). - Value(¬es), - ), - huh.NewGroup( - huh.NewInput(). - Title("Score"). - Description("If your score is in emoji, type 1 for 😞, 2 for 😐 and 3 for 😊"). - Prompt("> "). - Validate(func(s string) error { - _, err := strconv.ParseFloat(s, 64) - return err - }). - Value(&scoreString), - ), - ).Run() + for { + input, err := ui.PrettyInput("Score (use 1, 2, 3 for emojis)", "", func(s string) error { + _, err := strconv.ParseFloat(s, 64) + return err + }) + if err != nil { + fmt.Println(ui.ErrorText(err)) + continue + } + scoreString = input + break + } // parse form strings to API required data type completedDate, err := time.Parse("02/01/2006", strings.TrimSpace(currDate)) @@ -225,11 +239,7 @@ func HandleMediaUpdate(params MediaUpdateParams) error { return nil } - dbCtx, err := db.NewDbConn(false) - if err != nil { - return err - } - userId, err := dbCtx.GetConfig("user_id") + userId, err := credstore.GetCredential("user_id") if err != nil { return err }