tail_core 0.1.1

Core library for the Tail operating system
Documentation
// Copyright 2025, TAIL OS. All Rights Reserved.
//
// You must obtain a written license from and pay applicable license fees to TAIL OS
// before you may reproduce, modify, or distribute this software, or any work that
// includes all or part of this software.
//
// Free development licenses are available for evaluation, research, and non-commercial
// purposes, which may include access to the source code under these terms. Redistribution
// or commercial use without a license is strictly prohibited.
//
// This file may contain contributions from others. Please review this entire file for
// other proprietary rights or license notices, as well as the TAIL OS License Guide at
// https://tail-os.com/license-guide/ for more information.
//
// For licensing inquiries, visit https://tail-os.com or email license@tail-os.com.


use core::marker::PhantomData;

pub struct ServiceRequestData<T: ?Sized> {
    request_message_ptr: *const u8,
    request_message_size: usize,
    _marker: PhantomData<T>,
}

// Implementation for Sized types (e.g., structs, arrays, etc.)
impl<T: Sized> ServiceRequestData<T> {
    pub fn new(request_message_ptr: *const T, request_message_size: usize) -> Self {
        Self {
            request_message_ptr: request_message_ptr as *const u8,
            request_message_size,
            _marker: PhantomData,
        }
    }

    pub fn get_request_message_ref(&self) -> &T {
        unsafe { &*(self.request_message_ptr as *const T) }
    }

    pub fn get_request_message_ref_mut(&mut self) -> &mut T {
        unsafe { &mut *(self.request_message_ptr as *mut T) }
    }

    pub fn set_request_message_ptr(&mut self, message_ptr: *const T) {
        self.request_message_ptr = message_ptr as *const u8;
    }
}

// Implementation for all T: ?Sized (shared methods)
impl<T: ?Sized> ServiceRequestData<T> {
    pub fn get_request_message_ptr(&self) -> *const u8 {
        self.request_message_ptr
    }

    pub fn get_request_message_ptr_mut(&mut self) -> *mut u8 {
        self.request_message_ptr as *mut u8
    }

    pub fn get_request_message_size(&self) -> usize {
        self.request_message_size
    }
}