this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

init ;10u

Anish Lakhwara 5ca28cfb

+221
db/crsqlite.so

This is a binary file and will not be displayed.

+25
db/migrations.go
··· 1 + package main 2 + 3 + import ( 4 + "database/sql" 5 + ) 6 + 7 + func RunMigrations(db *sql.DB) error { 8 + // Load the cr-sqlite extension 9 + _, err := db.Exec("SELECT load_extension('crsqlite.so')") 10 + if err != nil { 11 + return err 12 + } 13 + 14 + // Create the todos table and initialize it as a CRDT 15 + _, err = db.Exec(` 16 + CREATE TABLE IF NOT EXISTS todos (id INTEGER PRIMARY KEY, content TEXT); 17 + SELECT crsql_as_crr('todos'); 18 + `) 19 + if err != nil { 20 + return err 21 + } 22 + 23 + return nil 24 + } 25 +
+1
envrc
··· 1 + use flake
+27
flake.lock
··· 1 + { 2 + "nodes": { 3 + "nixpkgs": { 4 + "locked": { 5 + "lastModified": 1708407374, 6 + "narHash": "sha256-EECzarm+uqnNDCwaGg/ppXCO11qibZ1iigORShkkDf0=", 7 + "owner": "NixOS", 8 + "repo": "nixpkgs", 9 + "rev": "f33dd27a47ebdf11dc8a5eb05e7c8fbdaf89e73f", 10 + "type": "github" 11 + }, 12 + "original": { 13 + "owner": "NixOS", 14 + "ref": "nixpkgs-unstable", 15 + "repo": "nixpkgs", 16 + "type": "github" 17 + } 18 + }, 19 + "root": { 20 + "inputs": { 21 + "nixpkgs": "nixpkgs" 22 + } 23 + } 24 + }, 25 + "root": "root", 26 + "version": 7 27 + }
+14
flake.nix
··· 1 + { 2 + description = "A basic flake with a shell"; 3 + inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 4 + 5 + outputs = { nixpkgs, ... }: 6 + let 7 + pkgs = nixpkgs.legacyPackages."x86_64-linux"; 8 + in 9 + { 10 + devShells."x86_64-linux".default = pkgs.mkShell { 11 + packages = [ pkgs.go ]; 12 + }; 13 + }; 14 + }
+22
go.mod
··· 1 + module mast 2 + 3 + go 1.21.6 4 + 5 + require ( 6 + github.com/charmbracelet/bubbletea v0.26.6 // indirect 7 + github.com/charmbracelet/x/ansi v0.1.2 // indirect 8 + github.com/charmbracelet/x/input v0.1.0 // indirect 9 + github.com/charmbracelet/x/term v0.1.1 // indirect 10 + github.com/charmbracelet/x/windows v0.1.0 // indirect 11 + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect 12 + github.com/mattn/go-localereader v0.0.1 // indirect 13 + github.com/mattn/go-runewidth v0.0.15 // indirect 14 + github.com/mattn/go-sqlite3 v1.14.22 // indirect 15 + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect 16 + github.com/muesli/cancelreader v0.2.2 // indirect 17 + github.com/rivo/uniseg v0.4.7 // indirect 18 + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect 19 + golang.org/x/sync v0.7.0 // indirect 20 + golang.org/x/sys v0.21.0 // indirect 21 + golang.org/x/text v0.3.8 // indirect 22 + )
+34
go.sum
··· 1 + github.com/charmbracelet/bubbletea v0.26.6 h1:zTCWSuST+3yZYZnVSvbXwKOPRSNZceVeqpzOLN2zq1s= 2 + github.com/charmbracelet/bubbletea v0.26.6/go.mod h1:dz8CWPlfCCGLFbBlTY4N7bjLiyOGDJEnd2Muu7pOWhk= 3 + github.com/charmbracelet/x/ansi v0.1.2 h1:6+LR39uG8DE6zAmbu023YlqjJHkYXDF1z36ZwzO4xZY= 4 + github.com/charmbracelet/x/ansi v0.1.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= 5 + github.com/charmbracelet/x/input v0.1.0 h1:TEsGSfZYQyOtp+STIjyBq6tpRaorH0qpwZUj8DavAhQ= 6 + github.com/charmbracelet/x/input v0.1.0/go.mod h1:ZZwaBxPF7IG8gWWzPUVqHEtWhc1+HXJPNuerJGRGZ28= 7 + github.com/charmbracelet/x/term v0.1.1 h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI= 8 + github.com/charmbracelet/x/term v0.1.1/go.mod h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw= 9 + github.com/charmbracelet/x/windows v0.1.0 h1:gTaxdvzDM5oMa/I2ZNF7wN78X/atWemG9Wph7Ika2k4= 10 + github.com/charmbracelet/x/windows v0.1.0/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= 11 + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= 12 + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= 13 + github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= 14 + github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= 15 + github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= 16 + github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 17 + github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= 18 + github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 19 + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= 20 + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= 21 + github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= 22 + github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= 23 + github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 24 + github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 25 + github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 26 + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= 27 + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= 28 + golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= 29 + golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 30 + golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 31 + golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= 32 + golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 33 + golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= 34 + golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+98
main.go
··· 1 + package main 2 + 3 + import ( 4 + "database/sql" 5 + "fmt" 6 + "os" 7 + 8 + tea "github.com/charmbracelet/bubbletea" 9 + _ "github.com/mattn/go-sqlite3" 10 + "git.sealight.xyz/aynish/mast/db" 11 + ) 12 + 13 + type model struct { 14 + db *sql.DB 15 + todos []string 16 + cursor int 17 + } 18 + 19 + func initialModel() model { 20 + db, err := sql.Open("sqlite3", ":memory:") 21 + if err != nil { 22 + panic(err) 23 + } 24 + 25 + err = RunMigrations(db) 26 + if err != nil { 27 + panic(err) 28 + } 29 + 30 + m := model{ 31 + db: db, 32 + todos: []string{}, 33 + cursor: 0, 34 + } 35 + m.loadTodos() 36 + return m 37 + } 38 + 39 + func (m *model) addTodo(todo string) { 40 + _, err := m.db.Exec("INSERT INTO todos (content) VALUES (?)", todo) 41 + if err != nil { 42 + panic(err) 43 + } 44 + m.loadTodos() 45 + } 46 + 47 + func (m *model) loadTodos() { 48 + rows, err := m.db.Query("SELECT content FROM todos") 49 + if err != nil { 50 + panic(err) 51 + } 52 + defer rows.Close() 53 + 54 + m.todos = []string{} 55 + for rows.Next() { 56 + var content string 57 + if err := rows.Scan(&content); err != nil { 58 + panic(err) 59 + } 60 + m.todos = append(m.todos, content) 61 + } 62 + } 63 + 64 + func (m model) Init() tea.Cmd { 65 + return nil 66 + } 67 + 68 + func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { 69 + switch msg := msg.(type) { 70 + case tea.KeyMsg: 71 + switch msg.String() { 72 + case "ctrl+c", "q": 73 + return m, tea.Quit 74 + } 75 + } 76 + return m, nil 77 + } 78 + 79 + func (m model) View() string { 80 + s := "Todo List:\n\n" 81 + for i, todo := range m.todos { 82 + cursor := " " 83 + if m.cursor == i { 84 + cursor = ">" 85 + } 86 + s += fmt.Sprintf("%s %s\n", cursor, todo) 87 + } 88 + s += "\nPress q to quit.\n" 89 + return s 90 + } 91 + 92 + func main() { 93 + p := tea.NewProgram(initialModel()) 94 + if _, err := p.Run(); err != nil { 95 + fmt.Printf("Alas, there's been an error: %v", err) 96 + os.Exit(1) 97 + } 98 + }