github.com/SaurabhDubey-Groww/go-cloud@v0.0.0-20221124105541-b26c29285fd8/runtimevar/driver/driver.go (about) 1 // Copyright 2018 The Go Cloud Development Kit Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Package driver defines interfaces to be implemented by runtimevar drivers, which 16 // will be used by the runtimevar package to interact with the underlying services. 17 // Application code should use package runtimevar. 18 package driver // import "gocloud.dev/runtimevar/driver" 19 20 import ( 21 "context" 22 "time" 23 24 "gocloud.dev/gcerrors" 25 ) 26 27 // DefaultWaitDuration is the default value for WaitDuration. 28 const DefaultWaitDuration = 30 * time.Second 29 30 // WaitDuration returns DefaultWaitDuration if d is <= 0, otherwise it returns d. 31 func WaitDuration(d time.Duration) time.Duration { 32 if d <= 0 { 33 return DefaultWaitDuration 34 } 35 return d 36 } 37 38 // State represents the current state of a variable. 39 type State interface { 40 // Value returns the current variable value. 41 Value() (interface{}, error) 42 // UpdateTime returns the update time for the variable. 43 UpdateTime() time.Time 44 45 // As converts i to driver-specific types. 46 // See https://gocloud.dev/concepts/as/ for background information. 47 As(interface{}) bool 48 } 49 50 // Watcher watches for updates on a variable and returns an updated Variable object if 51 // there are changes. A Watcher object is associated with a variable upon construction. 52 // 53 // An application can have more than one Watcher, one for each variable. It is typical 54 // to only have one Watcher per variable. 55 // 56 // Many services store their configuration data as raw bytes; drivers for such 57 // services should include a runtimevar.Decoder in their constructor to allow 58 // users to decode the raw bytes into a particular format (e.g., parsing a 59 // JSON string). 60 // 61 // Drivers for services that don't have raw bytes may dictate the type of the exposed 62 // Snapshot.Value, or expose custom decoding logic. 63 type Watcher interface { 64 // WatchVariable returns the current State of the variable. 65 // If the State has not changed, it returns nil. 66 // 67 // If WatchVariable returns a wait time > 0, the portable type uses 68 // it as a hint to not call WatchVariable again for the wait time. 69 // 70 // Implementations *may* block, but must return if ctx is Done. If the 71 // variable has changed, then implementations *must* eventually return 72 // it. 73 // 74 // A polling implementation should return (State, <poll interval>) for 75 // a new State, or (nil, <poll interval>) if State hasn't changed. 76 // 77 // An implementation that receives notifications from an external source 78 // about changes to the underlying variable should: 79 // 1. If prev != nil, subscribe to change notifications. 80 // 2. Fetch the current State. 81 // 3. If prev == nil or if the State has changed, return (State, 0). 82 // A non-zero wait should be returned if State holds an error, to avoid 83 // spinning. 84 // 4. Block until it detects a change or ctx is Done, then fetch and return 85 // (State, 0). 86 // Note that the subscription in 1 must occur before 2 to avoid race conditions. 87 WatchVariable(ctx context.Context, prev State) (state State, wait time.Duration) 88 89 // Close cleans up any resources used by the Watcher object. 90 Close() error 91 92 // ErrorAs allows drivers to expose driver-specific types for returned 93 // errors; see State.As for more details. 94 ErrorAs(error, interface{}) bool 95 96 // ErrorCode should return a code that describes the error, which was returned by 97 // one of the other methods in this interface. 98 ErrorCode(error) gcerrors.ErrorCode 99 }