github.com/mutagen-io/mutagen@v0.18.0-rc1/pkg/synchronization/session.go (about)

     1  package synchronization
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/mutagen-io/mutagen/pkg/identifier"
     8  	"github.com/mutagen-io/mutagen/pkg/selection"
     9  	"github.com/mutagen-io/mutagen/pkg/url"
    10  )
    11  
    12  // EnsureValid ensures that Session's invariants are respected.
    13  func (s *Session) EnsureValid() error {
    14  	// A nil session is not valid.
    15  	if s == nil {
    16  		return errors.New("nil session")
    17  	}
    18  
    19  	// Ensure that the session identifier is valid.
    20  	if !identifier.IsValid(s.Identifier) {
    21  		return errors.New("invalid session identifier")
    22  	}
    23  
    24  	// Ensure that the session version is supported.
    25  	if !s.Version.Supported() {
    26  		return errors.New("unknown or unsupported session version")
    27  	}
    28  
    29  	// Ensure that the creation time is present.
    30  	if s.CreationTime == nil {
    31  		return errors.New("missing creation time")
    32  	}
    33  
    34  	// Ensure that the alpha URL is valid and is a synchronization URL.
    35  	if err := s.Alpha.EnsureValid(); err != nil {
    36  		return fmt.Errorf("invalid alpha URL: %w", err)
    37  	} else if s.Alpha.Kind != url.Kind_Synchronization {
    38  		return errors.New("alpha URL is not a synchronization URL")
    39  	}
    40  
    41  	// Ensure that the beta URL is valid and is a synchronization URL.
    42  	if err := s.Beta.EnsureValid(); err != nil {
    43  		return fmt.Errorf("invalid beta URL: %w", err)
    44  	} else if s.Beta.Kind != url.Kind_Synchronization {
    45  		return errors.New("beta URL is not a synchronization URL")
    46  	}
    47  
    48  	// Ensure that the configuration is valid.
    49  	if err := s.Configuration.EnsureValid(false); err != nil {
    50  		return fmt.Errorf("invalid configuration: %w", err)
    51  	}
    52  
    53  	// Ensure that the alpha-specific configuration is valid.
    54  	if err := s.ConfigurationAlpha.EnsureValid(true); err != nil {
    55  		return fmt.Errorf("invalid alpha-specific configuration: %w", err)
    56  	}
    57  
    58  	// Ensure that the beta-specific configuration is valid.
    59  	if err := s.ConfigurationBeta.EnsureValid(true); err != nil {
    60  		return fmt.Errorf("invalid beta-specific configuration: %w", err)
    61  	}
    62  
    63  	// Validate the session name.
    64  	if err := selection.EnsureNameValid(s.Name); err != nil {
    65  		return fmt.Errorf("invalid session name: %w", err)
    66  	}
    67  
    68  	// Ensure that labels are valid.
    69  	for k, v := range s.Labels {
    70  		if err := selection.EnsureLabelKeyValid(k); err != nil {
    71  			return fmt.Errorf("invalid label key: %w", err)
    72  		} else if err = selection.EnsureLabelValueValid(v); err != nil {
    73  			return fmt.Errorf("invalid label value: %w", err)
    74  		}
    75  	}
    76  
    77  	// Success.
    78  	return nil
    79  }