/*
 * Copyright (c) 2026-present, the Ladybird developers.
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

/* Generated with cbindgen:0.29.2 */

#include <stdint.h>
#include <stddef.h>

namespace Web {
namespace CSS {
namespace Parser {
namespace FFI {

enum class CssTokenType {
    Invalid,
    EndOfFile,
    Ident,
    Function,
    AtKeyword,
    Hash,
    String,
    BadString,
    Url,
    BadUrl,
    Delim,
    Number,
    Percentage,
    Dimension,
    Whitespace,
    CDO,
    CDC,
    Colon,
    Semicolon,
    Comma,
    OpenSquare,
    CloseSquare,
    OpenParen,
    CloseParen,
    OpenCurly,
    CloseCurly,
};

enum class CssHashType {
    Id,
    Unrestricted,
};

enum class CssNumberType {
    Number,
    IntegerWithExplicitSign,
    Integer,
};

struct CssToken {
    CssTokenType token_type;
    CssHashType hash_type;
    CssNumberType number_type;
    double number_value;
    uint32_t delim;
    const uint8_t *value_ptr;
    size_t value_len;
    const uint8_t *original_source_ptr;
    size_t original_source_len;
    size_t start_line;
    size_t start_column;
    size_t end_line;
    size_t end_column;
};

extern "C" {

/// # Safety
/// - `input` and `input_len` must point to a valid string
/// - `ctx` must be a valid pointer to a CallbackContext
/// - Parameters provided to `callback` must be valid pointers
void rust_css_tokenize(const uint8_t *input, size_t input_len, void *ctx, void (*callback)(void *ctx,
                                                                                           const CssToken *token));

extern uint8_t *ladybird_rust_alloc(size_t size, size_t alignment);

extern uint8_t *ladybird_rust_alloc_zeroed(size_t size, size_t alignment);

extern void ladybird_rust_dealloc(uint8_t *ptr, size_t alignment);

extern uint8_t *ladybird_rust_realloc(uint8_t *ptr, size_t old_size, size_t new_size, size_t alignment);

}  // extern "C"

}  // namespace FFI
}  // namespace Parser
}  // namespace CSS
}  // namespace Web
