// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package resource // import "go.opentelemetry.io/otel/sdk/resource"

import (
	
	

	
	semconv 
)

type osDescriptionProvider func() (string, error)

var defaultOSDescriptionProvider osDescriptionProvider = platformOSDescription

var osDescription = defaultOSDescriptionProvider

func setDefaultOSDescriptionProvider() {
	setOSDescriptionProvider(defaultOSDescriptionProvider)
}

func setOSDescriptionProvider( osDescriptionProvider) {
	osDescription = 
}

type (
	osTypeDetector        struct{}
	osDescriptionDetector struct{}
)

// Detect returns a *Resource that describes the operating system type the
// service is running on.
func (osTypeDetector) (context.Context) (*Resource, error) {
	 := runtimeOS()

	 := mapRuntimeOSToSemconvOSType()

	return NewWithAttributes(
		semconv.SchemaURL,
		,
	), nil
}

// Detect returns a *Resource that describes the operating system the
// service is running on.
func (osDescriptionDetector) (context.Context) (*Resource, error) {
	,  := osDescription()
	if  != nil {
		return nil, 
	}

	return NewWithAttributes(
		semconv.SchemaURL,
		semconv.OSDescription(),
	), nil
}

// mapRuntimeOSToSemconvOSType translates the OS name as provided by the Go runtime
// into an OS type attribute with the corresponding value defined by the semantic
// conventions. In case the provided OS name isn't mapped, it's transformed to lowercase
// and used as the value for the returned OS type attribute.
func mapRuntimeOSToSemconvOSType( string) attribute.KeyValue {
	// the elements in this map are the intersection between
	// available GOOS values and defined semconv OS types
	 := map[string]attribute.KeyValue{
		"aix":       semconv.OSTypeAIX,
		"darwin":    semconv.OSTypeDarwin,
		"dragonfly": semconv.OSTypeDragonflyBSD,
		"freebsd":   semconv.OSTypeFreeBSD,
		"linux":     semconv.OSTypeLinux,
		"netbsd":    semconv.OSTypeNetBSD,
		"openbsd":   semconv.OSTypeOpenBSD,
		"solaris":   semconv.OSTypeSolaris,
		"windows":   semconv.OSTypeWindows,
		"zos":       semconv.OSTypeZOS,
	}

	var  attribute.KeyValue

	if ,  := [];  {
		 = 
	} else {
		 = semconv.OSTypeKey.String(strings.ToLower())
	}

	return 
}