package irontelemetry import ( "errors" "net/url" "strings" "github.com/google/uuid" ) // ParseDSN parses a DSN string into its components // Format: https://pk_live_xxx@irontelemetry.com func ParseDSN(dsn string) (*ParsedDSN, error) { parsed, err := url.Parse(dsn) if err != nil { return nil, errors.New("invalid DSN format: " + dsn) } publicKey := parsed.User.Username() if publicKey == "" || !strings.HasPrefix(publicKey, "pk_") { return nil, errors.New("DSN must contain a valid public key starting with pk_") } return &ParsedDSN{ PublicKey: publicKey, Host: parsed.Host, Protocol: parsed.Scheme, APIBaseURL: parsed.Scheme + "://" + parsed.Host, }, nil } // GenerateEventID generates a unique event ID func GenerateEventID() string { return uuid.New().String() } // ResolveOptions validates and fills in defaults for options func ResolveOptions(opts Options) (Options, *ParsedDSN, error) { parsedDSN, err := ParseDSN(opts.DSN) if err != nil { return opts, nil, err } defaults := DefaultOptions() if opts.Environment == "" { opts.Environment = defaults.Environment } if opts.AppVersion == "" { opts.AppVersion = defaults.AppVersion } if opts.SampleRate == 0 { opts.SampleRate = defaults.SampleRate } if opts.SampleRate < 0 { opts.SampleRate = 0 } if opts.SampleRate > 1 { opts.SampleRate = 1 } if opts.MaxBreadcrumbs == 0 { opts.MaxBreadcrumbs = defaults.MaxBreadcrumbs } if opts.MaxOfflineQueueSize == 0 { opts.MaxOfflineQueueSize = defaults.MaxOfflineQueueSize } if opts.APIBaseURL == "" { opts.APIBaseURL = parsedDSN.APIBaseURL } return opts, parsedDSN, nil }