Add Cross SDKs support (part 2)
[src/xds/xds-server.git] / lib / crosssdk / sdks.go
index 435aae6..87bb85d 100644 (file)
@@ -3,6 +3,7 @@ package crosssdk
 import (
        "path"
        "path/filepath"
+       "sync"
 
        "github.com/Sirupsen/logrus"
        "github.com/iotbzh/xds-server/lib/common"
@@ -10,7 +11,11 @@ import (
 )
 
 // SDKs List of installed SDK
-type SDKs []*SDK
+type SDKs struct {
+       Sdks []SDK
+
+       mutex sync.Mutex
+}
 
 // Init creates a new instance of Syncthing
 func Init(cfg *xdsconfig.Config, log *logrus.Logger) (*SDKs, error) {
@@ -27,13 +32,61 @@ func Init(cfg *xdsconfig.Config, log *logrus.Logger) (*SDKs, error) {
                        log.Debugf("Error while retrieving SDKs: dir=%s, error=%s", sdkRD, err.Error())
                        return &s, err
                }
+               s.mutex.Lock()
+               defer s.mutex.Unlock()
+
                for _, d := range dirs {
                        sdk, err := NewCrossSDK(d)
                        if err != nil {
                                log.Debugf("Error while processing SDK dir=%s, err=%s", d, err.Error())
                        }
-                       s = append(s, sdk)
+                       s.Sdks = append(s.Sdks, *sdk)
                }
        }
+
+       log.Debugf("SDKs: %d cross sdks found", len(s.Sdks))
+
        return &s, nil
 }
+
+// GetAll returns all existing SDKs
+func (s *SDKs) GetAll() []SDK {
+       s.mutex.Lock()
+       defer s.mutex.Unlock()
+       res := s.Sdks
+       return res
+}
+
+// Get returns an SDK from id
+func (s *SDKs) Get(id int) SDK {
+       s.mutex.Lock()
+       defer s.mutex.Unlock()
+
+       if id < 0 || id > len(s.Sdks) {
+               return SDK{}
+       }
+       res := s.Sdks[id]
+       return res
+}
+
+// GetEnvCmd returns the command used to initialized the environment for an SDK
+func (s *SDKs) GetEnvCmd(id string, defaultID string) string {
+       if id == "" && defaultID == "" {
+               // no env cmd
+               return ""
+       }
+
+       s.mutex.Lock()
+       defer s.mutex.Unlock()
+       defaultEnv := ""
+       for _, sdk := range s.Sdks {
+               if sdk.ID == id {
+                       return sdk.GetEnvCmd()
+               }
+               if sdk.ID == defaultID {
+                       defaultEnv = sdk.GetEnvCmd()
+               }
+       }
+       // Return default env that may be empty
+       return defaultEnv
+}