pebble/src/fw/applib/template_string.h
2025-01-27 11:38:16 -08:00

99 lines
4.4 KiB
C

/*
* Copyright 2024 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
*
* 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.
*/
#pragma once
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
//! Variables that change how a template string is evaluated
typedef struct TemplateStringVars {
time_t current_time;
} TemplateStringVars;
//! Variables that are used for determining when the string must be re-evaluated
typedef struct TemplateStringEvalConditions {
//! If true, string MUST be re-evaluated on eval_time, regardless of other conditions.
//! Otherwise, only re-evaluate if all the other conditions are also true.
bool force_eval_on_time;
//! Timestamp for next time to re-evaluate the string
//! If this is 0, there is no need to re-evaluate based on time
time_t eval_time;
} TemplateStringEvalConditions;
//! Bitfield describing errors in a template string
typedef enum TemplateStringErrorStatus {
//! No error occurred. `index_in_string` is invalid.
TemplateStringErrorStatus_Success = 0,
//! Couldn't resolve the template string to a final string.
TemplateStringErrorStatus_CantResolve,
//! Closing curly-brace was missing.
TemplateStringErrorStatus_MissingClosingBrace,
//! Missing argument.
TemplateStringErrorStatus_MissingArgument,
//! No result was generated.
TemplateStringErrorStatus_NoResultGenerated,
//! Unknown filter used.
TemplateStringErrorStatus_UnknownFilter,
//! format() was not the last filter.
TemplateStringErrorStatus_FormatBeforeLast,
//! Time unit in predicate is invalid.
TemplateStringErrorStatus_InvalidTimeUnit,
//! Escape character at end of string.
TemplateStringErrorStatus_InvalidEscapeCharacter,
//! Opening parenthesis for filter was missing.
TemplateStringErrorStatus_MissingOpeningParen,
//! Closing parenthesis for filter was missing.
TemplateStringErrorStatus_MissingClosingParen,
//! Invalid conversion specifier for format.
TemplateStringErrorStatus_InvalidConversionSpecifier,
//! Invalid parameter.
TemplateStringErrorStatus_InvalidParameter,
//! Opening quote for filter was missing.
TemplateStringErrorStatus_MissingOpeningQuote,
//! Closing quote for filter was missing.
TemplateStringErrorStatus_MissingClosingQuote,
//! Invalid argument separator.
TemplateStringErrorStatus_InvalidArgumentSeparator,
TemplateStringErrorStatusCount,
} TemplateStringErrorStatus;
//! Contains information about a template string error
typedef struct TemplateStringError {
//! 0-indexed position in the input string where the error occurred.
size_t index_in_string;
TemplateStringErrorStatus status;
} TemplateStringError;
//! @param input_template_string The template string to evaluate
//! @param output A pointer to a string buffer for which to write the evaluated string output upon
//! success. May be NULL for no output
//! @param output_size The size of the output string buffer in bytes; no bytes beyond this size
//! will be written to the output string buffer. This should also include the
//! ending NUL terminator. May be 0 for no output
//! @param reeval_cond Pointer to a structure that will be filled with information on when to
//! re-evaluate the string. Maybe be NULL
//! @param vars Pointer to variables that affect how the template string will be evaluated
//! @param errors Pointer to a TemplateStringError that will be set to contain information about
//! the first error detected in the template string upon failure
//! @return True if the template string is successfully evaluated and the output written to the
//! provided output string buffer, false otherwise
bool template_string_evaluate(const char *input_template_string, char *output, size_t output_size,
TemplateStringEvalConditions *reeval_cond,
const TemplateStringVars *vars, TemplateStringError *error);