// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "tracing/scoped_tracer_factory.h"

#include <memory>
#include <utility>

#include "absl/base/nullability.h"
#include "tracing/tracer_factory.h"

namespace credentio_tracing {

ScopedTracerFactory::ScopedTracerFactory(
    absl_nullable std::shared_ptr<TracerFactory> factory)
    : previous_factory_(TracerFactory::GetThreadLocalFactory()) {
  TracerFactory::SetThreadLocalFactory(std::move(factory));
}

ScopedTracerFactory::~ScopedTracerFactory() {
  TracerFactory::SetThreadLocalFactory(std::move(previous_factory_));
}

}  // namespace credentio_tracing
