diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3a643e5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2024, Paweł Gronowski + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..48efe5a --- /dev/null +++ b/README.md @@ -0,0 +1,54 @@ +# livefile + +## Overview +The `livefile` provides an easy, read-write access to a live-reloadable struct instance backed by a JSON file with a transaction-like API. + +### Example + +```go +import ( + "context" + "fmt" + + "woland.xyz/livefile" +) + +type MyState struct { + Value int + Name string +} + +func main() { + ctx := context.Background() + lf := livefile.New[MyState]("state.json") + + // View the initial state + lf.View(ctx, func(s *MyState) { + fmt.Println("Updated State:", *s) + }) + + // Update the state + err := lf.Update(ctx, func(s *MyState) error { + s.Value = 42 + s.Name = "Updated" + return nil + }) + if err != nil { + panic(err) + } + + // View the modified state + lf.View(ctx, func(s *MyState) { + fmt.Println("Updated State:", *s) + }) + + // Perform external modification + if err := os.WriteFile("state.json", []byte(`{"Name":"foo","Value":100}`), 0o777); err != nil { + panic(err) + } + + // Get a copy of the state + s := lf.Peek(ctx) + fmt.Println("Final state:", s) +} +```