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  }