// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You 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
//
//     http://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.
//

pub static SKYWALKING_HTTP_CONTEXT_HEADER_KEY: &str = "sw8";

#[derive(Debug)]
pub struct PropagationContext {
    /// It defines whether next span should be trace or not.
    /// In SkyWalking, If `do_sample == true`, the span should be reported to
    /// OAP server and can be analyzed.
    pub do_sample: bool,

    /// It defines trace ID that previous span has. It expresses unique value of
    /// entire trace.
    pub parent_trace_id: String,

    /// It defines segment ID that previous span has. It expresses unique value
    /// of entire trace.
    pub parent_trace_segment_id: String,

    /// It defines parent span's span ID.
    pub parent_span_id: i32,

    /// Service name of service parent belongs.
    pub parent_service: String,

    /// Instance name of service parent belongs.
    pub parent_service_instance: String,

    /// An endpoint name that parent requested to.
    pub destination_endpoint: String,

    /// An address that parent requested to. It can be authority or network
    /// address.
    pub destination_address: String,
}

/// PropagationContext carries the context which include trace information.
/// In general, this context will be used if you create new TraceContext after
/// received decoded context that should be packed in `sw8` header.
impl PropagationContext {
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        do_sample: bool,
        parent_trace_id: String,
        parent_trace_segment_id: String,
        parent_span_id: i32,
        parent_service: String,
        parent_service_instance: String,
        destination_endpoint: String,
        destination_address: String,
    ) -> PropagationContext {
        PropagationContext {
            do_sample,
            parent_trace_id,
            parent_trace_segment_id,
            parent_span_id,
            parent_service,
            parent_service_instance,
            destination_endpoint,
            destination_address,
        }
    }
}
