oont-contents/plugins/jetpack-boost/jetpack_vendor/automattic/jetpack-schema/src/class-schema-context.php
2025-02-08 15:10:23 +01:00

119 lines
2.5 KiB
PHP

<?php
namespace Automattic\Jetpack\Schema;
class Schema_Context {
private $name;
private $data;
private $path = array();
/**
* @var array $log Log of notable actions taken during parsing.
*/
private $log = array();
/**
* @param string $name
*/
public function __construct( $name ) {
$this->name = $name;
}
public function add_to_path( $key ) {
$this->path[] = $key;
}
private function trace( $depth_limit = 15 ) {
if ( ! Utils::is_debug() ) {
return;
}
$trace = array();
// This is fine, it's guarded by `SCHEMA_TRACE` constant.
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
foreach ( debug_backtrace() as $stack_frame ) {
if ( isset( $stack_frame['line'], $stack_frame['file'] ) ) {
$filename_pieces = explode( '.', basename( $stack_frame['file'] ), 2 );
$trace[] = $filename_pieces[0] . ':' . $stack_frame['line'];
} elseif ( isset( $stack_frame['class'], $stack_frame['function'] ) ) {
$trace[] = $stack_frame['class'] . '::' . $stack_frame['function'];
}
--$depth_limit;
if ( $depth_limit <= 0 ) {
break;
}
}
return $trace;
}
public function log( $message, $data, $error = null ) {
if ( ! Utils::is_debug() ) {
return;
}
$meta = array(
'name' => $this->get_name(),
'path' => $this->get_path(),
);
$trace = defined( 'SCHEMA_TRACE' ) && \SCHEMA_TRACE > 0 ? $this->trace( \SCHEMA_TRACE ) : null;
if ( $trace ) {
$meta['trace'] = $trace;
}
if ( $error instanceof Schema_Error ) {
$meta['error_message'] = $error->getMessage();
$meta['value'] = $error->get_value();
}
$this->log[] = array(
'message' => $message,
'meta' => $meta,
);
}
public function verbose_log( $message, $data ) {
if ( ! Utils::is_verbose() ) {
return;
}
$this->log( $message, $data );
}
public function get_log() {
return $this->log;
}
public function get_path() {
$path = $this->name;
if ( ! empty( $this->path ) ) {
$path .= '.' . implode( '.', $this->path );
}
return $path;
}
public function remove_path( $key ) {
$index = array_search( $key, $this->path, true );
if ( $index !== false ) {
unset( $this->path[ $index ] );
}
// Reindex the array.
$this->path = array_values( $this->path );
}
public function get_name() {
return $this->name;
}
public function set_data( $data ) {
if ( ! isset( $this->data ) ) {
$this->data = $data;
}
}
public function get_data() {
return $this->data;
}
}