online-dsl-forge 0.3.3

A bounded parser and runtime for in-memory DSL expressions.
Documentation
use crate::parser::SourceSpan;
use crate::sema::profile::{BodyAccess, BodyNeedSummary, BodyTarget};
use crate::sema::schema::CapabilityMeta;

use super::AnalyzeState;
use super::support::ObjectOrigin;

impl<'a> AnalyzeState<'a> {
  pub(super) fn merge_body_access_for_path(
    &self,
    body_need: &mut BodyNeedSummary,
    path: Option<&[String]>,
  ) {
    if let Some(path) = path
      && let Some((target, access)) = self.schema.body_access_for_path(path)
    {
      body_need.merge_target(target, access);
    }
  }

  pub(super) fn merge_body_access_for_origin(
    &self,
    body_need: &mut BodyNeedSummary,
    origin: Option<ObjectOrigin>,
    field: &str,
    span: SourceSpan,
  ) {
    let Some(origin) = origin else {
      return;
    };
    match (origin, field) {
      (ObjectOrigin::RequestBody, "Size") => {
        body_need.merge_target(BodyTarget::Request, BodyAccess::SizeOnly)
      }
      (ObjectOrigin::ResponseBody, "Size") => {
        body_need.merge_target(BodyTarget::Response, BodyAccess::SizeOnly)
      }
      (ObjectOrigin::RequestBody, "Bytes" | "Text" | "IsTruncated") => {
        body_need.merge_target(BodyTarget::Request, BodyAccess::PrefixBytes)
      }
      (ObjectOrigin::ResponseBody, "Bytes" | "Text" | "IsTruncated") => {
        body_need.merge_target(BodyTarget::Response, BodyAccess::PrefixBytes)
      }
      (ObjectOrigin::Stream, "Payload") => {
        body_need.merge_target(BodyTarget::Stream, BodyAccess::PrefixBytes)
      }
      _ => {
        let _ = span;
      }
    }
  }

  pub(super) fn merge_body_access_for_exposed_origin(
    &self,
    body_need: &mut BodyNeedSummary,
    origin: Option<ObjectOrigin>,
  ) {
    let Some(target) = origin.and_then(ObjectOrigin::body_target) else {
      return;
    };
    body_need.merge_target(target, BodyAccess::PrefixBytes);
  }

  pub(super) fn body_need_for_consumed_analysis(
    &self,
    body_need: BodyNeedSummary,
    origin: Option<ObjectOrigin>,
  ) -> BodyNeedSummary {
    let mut consumed_body_need = body_need;
    self.merge_body_access_for_exposed_origin(&mut consumed_body_need, origin);
    consumed_body_need
  }

  pub(super) fn merge_body_access_for_method(
    &self,
    body_need: &mut BodyNeedSummary,
    origin: Option<ObjectOrigin>,
    capability: &CapabilityMeta,
  ) {
    let Some(origin) = origin else {
      return;
    };
    let Some(target) = origin.body_target() else {
      return;
    };
    body_need.merge_target(target, capability.body_access);
  }
}