github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/system/initial/demo/demo.go (about) 1 // This file is part of the Smart Home 2 // Program complex distribution https://github.com/e154/smart-home 3 // Copyright (C) 2023, Filippov Alex 4 // 5 // This library is free software: you can redistribute it and/or 6 // modify it under the terms of the GNU Lesser General Public 7 // License as published by the Free Software Foundation; either 8 // version 3 of the License, or (at your option) any later version. 9 // 10 // This library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 // Library General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public 16 // License along with this library. If not, see 17 // <https://www.gnu.org/licenses/>. 18 19 package demo 20 21 import ( 22 "context" 23 "time" 24 25 "github.com/e154/smart-home/adaptors" 26 "github.com/e154/smart-home/common/logger" 27 ) 28 29 const ( 30 ctxTimeout = 5 31 ) 32 33 var ( 34 log = logger.MustGetLogger("demo") 35 ) 36 37 type Demos struct { 38 list map[string]Demo 39 } 40 41 func NewDemos(list map[string]Demo) *Demos { 42 return &Demos{ 43 list: list, 44 } 45 } 46 47 func (t *Demos) InstallByName(ctx context.Context, adaptors *adaptors.Adaptors, name string) (err error) { 48 49 if name == "" { 50 return 51 } 52 53 ctx, ctxCancel := context.WithTimeout(ctx, time.Second*ctxTimeout) 54 defer ctxCancel() 55 56 log.Infof("install demo \"%s\" ...", name) 57 58 ch := make(chan error, 1) 59 60 go func() { 61 var err error 62 defer func() { 63 ch <- err 64 close(ch) 65 }() 66 67 if err = ctx.Err(); err != nil { 68 return 69 } 70 if err = t.list[name].Install(ctx, adaptors); err != nil { 71 return 72 } 73 }() 74 75 select { 76 case v := <-ch: 77 err = v 78 case <-ctx.Done(): 79 err = ctx.Err() 80 } 81 82 return 83 }