okami.mom/ultraviolet
git clone https://git.nkp.pet/okami.mom/ultraviolet
03f41d2
main
1package main 2 3import ( 4"context" 5"fmt" 6"log" 7"os" 8"runtime/debug" 9"time" 10 11 uv"github.com/charmbracelet/ultraviolet" 12"github.com/charmbracelet/ultraviolet/screen" 13) 14 15type tickEvent struct {} 16 17func main () { 18t := uv .DefaultTerminal () 19scr := t .Screen () 20 21if err := t .Start ();err != nil { 22log .Fatalf ("failed to start terminal: %v" ,err ) 23 } 24 25defer func () { 26if r := recover ();r != nil { 27_ = t .Stop () 28fmt .Fprintf (os .Stderr ,"\r\nrecovered from panic: %v" ,r ) 29debug .PrintStack () 30 } 31 }() 32 33ctx ,cancel := context .WithCancel (context .Background ()) 34defer cancel () 35 36counter := 5 37ticker := time .NewTicker (time .Second ) 38go func () { 39for { 40select { 41case <- ctx .Done (): 42return 43case <- ticker .C : 44t .SendEvent (tickEvent {}) 45 } 46 } 47 }() 48 49view := func (c int )string { 50return fmt .Sprintf ("Panicing after %d seconds...\nPress 'q' or 'Ctrl+C' to exit." ,c ) 51 } 52 53OUT: 54for { 55select { 56case <- ctx .Done (): 57break OUT 58case ev := <- t .Events (): 59switch e := ev .(type ) { 60case uv.WindowSizeEvent : 61scr .Resize (e .Width ,2 ) 62case uv.KeyPressEvent : 63switch { 64case e .MatchString ("q" ,"ctrl+c" ): 65cancel () 66break OUT 67 } 68case tickEvent : 69counter -- 70if counter < 0 { 71panic ("Time's up!\n" ) 72 } 73 } 74 } 75 76ss := uv .NewStyledString (view (counter )) 77screen .Clear (scr ) 78scr .Display (ss ) 79 } 80 81ss := uv .NewStyledString (view (counter )+ "\n" ) 82screen .Clear (scr ) 83scr .Display (ss ) 84 85if err := t .Stop ();err != nil { 86log .Fatalf ("failed to stop terminal: %v" ,err ) 87 } 88}