use crate::action_embedded_destination::PdfActionEmbeddedDestination;
use crate::action_launch::PdfActionLaunch;
use crate::action_local_destination::PdfActionLocalDestination;
use crate::action_private::internal::PdfActionPrivate;
use crate::action_remote_destination::PdfActionRemoteDestination;
use crate::action_unsupported::PdfActionUnsupported;
use crate::action_uri::PdfActionUri;
use crate::bindgen::{
FPDF_ACTION, FPDF_DOCUMENT, PDFACTION_EMBEDDEDGOTO, PDFACTION_GOTO, PDFACTION_LAUNCH,
PDFACTION_REMOTEGOTO, PDFACTION_UNSUPPORTED, PDFACTION_URI,
};
use crate::bindings::PdfiumLibraryBindings;
use crate::error::PdfiumError;
#[derive(Debug, Copy, Clone, PartialOrd, PartialEq)]
pub enum PdfActionType {
GoToDestinationInSameDocument = PDFACTION_GOTO as isize,
GoToDestinationInRemoteDocument = PDFACTION_REMOTEGOTO as isize,
GoToDestinationInEmbeddedDocument = PDFACTION_EMBEDDEDGOTO as isize,
Launch = PDFACTION_LAUNCH as isize,
Uri = PDFACTION_URI as isize,
Unsupported = PDFACTION_UNSUPPORTED as isize,
}
impl PdfActionType {
pub(crate) fn from_pdfium(action_type: u32) -> Result<PdfActionType, PdfiumError> {
match action_type {
PDFACTION_GOTO => Ok(PdfActionType::GoToDestinationInSameDocument),
PDFACTION_REMOTEGOTO => Ok(PdfActionType::GoToDestinationInRemoteDocument),
PDFACTION_EMBEDDEDGOTO => Ok(PdfActionType::GoToDestinationInEmbeddedDocument),
PDFACTION_LAUNCH => Ok(PdfActionType::Launch),
PDFACTION_URI => Ok(PdfActionType::Uri),
PDFACTION_UNSUPPORTED => Ok(PdfActionType::Unsupported),
_ => Err(PdfiumError::UnknownActionType),
}
}
}
pub enum PdfAction<'a> {
LocalDestination(PdfActionLocalDestination<'a>),
RemoteDestination(PdfActionRemoteDestination<'a>),
EmbeddedDestination(PdfActionEmbeddedDestination<'a>),
Launch(PdfActionLaunch<'a>),
Uri(PdfActionUri<'a>),
Unsupported(PdfActionUnsupported<'a>),
}
impl<'a> PdfAction<'a> {
pub(crate) fn from_pdfium(
handle: FPDF_ACTION,
document: FPDF_DOCUMENT,
bindings: &'a dyn PdfiumLibraryBindings,
) -> Self {
match PdfActionType::from_pdfium(bindings.FPDFAction_GetType(handle) as u32)
.unwrap_or(PdfActionType::Unsupported)
{
PdfActionType::Unsupported => {
PdfAction::Unsupported(PdfActionUnsupported::from_pdfium(handle, bindings))
}
PdfActionType::GoToDestinationInSameDocument => PdfAction::LocalDestination(
PdfActionLocalDestination::from_pdfium(handle, document, bindings),
),
PdfActionType::GoToDestinationInRemoteDocument => PdfAction::RemoteDestination(
PdfActionRemoteDestination::from_pdfium(handle, bindings),
),
PdfActionType::GoToDestinationInEmbeddedDocument => PdfAction::EmbeddedDestination(
PdfActionEmbeddedDestination::from_pdfium(handle, bindings),
),
PdfActionType::Launch => {
PdfAction::Launch(PdfActionLaunch::from_pdfium(handle, bindings))
}
PdfActionType::Uri => {
PdfAction::Uri(PdfActionUri::from_pdfium(handle, document, bindings))
}
}
}
#[inline]
pub(crate) fn unwrap_as_trait(&self) -> &dyn PdfActionPrivate<'a> {
match self {
PdfAction::LocalDestination(action) => action,
PdfAction::RemoteDestination(action) => action,
PdfAction::EmbeddedDestination(action) => action,
PdfAction::Launch(action) => action,
PdfAction::Uri(action) => action,
PdfAction::Unsupported(action) => action,
}
}
#[inline]
#[allow(dead_code)] pub(crate) fn unwrap_as_trait_mut(&mut self) -> &mut dyn PdfActionPrivate<'a> {
match self {
PdfAction::LocalDestination(action) => action,
PdfAction::RemoteDestination(action) => action,
PdfAction::EmbeddedDestination(action) => action,
PdfAction::Launch(action) => action,
PdfAction::Uri(action) => action,
PdfAction::Unsupported(action) => action,
}
}
#[inline]
pub fn action_type(&self) -> PdfActionType {
match self {
PdfAction::LocalDestination(_) => PdfActionType::GoToDestinationInSameDocument,
PdfAction::RemoteDestination(_) => PdfActionType::GoToDestinationInRemoteDocument,
PdfAction::EmbeddedDestination(_) => PdfActionType::GoToDestinationInEmbeddedDocument,
PdfAction::Launch(_) => PdfActionType::Launch,
PdfAction::Uri(_) => PdfActionType::Uri,
PdfAction::Unsupported(_) => PdfActionType::Unsupported,
}
}
#[inline]
pub fn is_supported(&self) -> bool {
!self.is_unsupported()
}
#[inline]
pub fn is_unsupported(&self) -> bool {
self.action_type() == PdfActionType::Unsupported
}
#[inline]
pub fn as_local_destination_action(&self) -> Option<&PdfActionLocalDestination> {
match self {
PdfAction::LocalDestination(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_local_destination_action_mut(
&mut self,
) -> Option<&mut PdfActionLocalDestination<'a>> {
match self {
PdfAction::LocalDestination(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_remote_destination_action(&self) -> Option<&PdfActionRemoteDestination> {
match self {
PdfAction::RemoteDestination(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_remote_destination_action_mut(
&mut self,
) -> Option<&mut PdfActionRemoteDestination<'a>> {
match self {
PdfAction::RemoteDestination(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_embedded_destination_action(&self) -> Option<&PdfActionEmbeddedDestination> {
match self {
PdfAction::EmbeddedDestination(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_embedded_destination_action_mut(
&mut self,
) -> Option<&mut PdfActionEmbeddedDestination<'a>> {
match self {
PdfAction::EmbeddedDestination(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_launch_action(&self) -> Option<&PdfActionLaunch> {
match self {
PdfAction::Launch(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_launch_action_mut(&mut self) -> Option<&mut PdfActionLaunch<'a>> {
match self {
PdfAction::Launch(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_uri_action(&self) -> Option<&PdfActionUri> {
match self {
PdfAction::Uri(action) => Some(action),
_ => None,
}
}
#[inline]
pub fn as_uri_action_mut(&mut self) -> Option<&mut PdfActionUri<'a>> {
match self {
PdfAction::Uri(action) => Some(action),
_ => None,
}
}
}
pub trait PdfActionCommon<'a> {
}
impl<'a, T> PdfActionCommon<'a> for T where T: PdfActionPrivate<'a> {}
impl<'a> PdfActionPrivate<'a> for PdfAction<'a> {
#[inline]
fn handle(&self) -> &FPDF_ACTION {
self.unwrap_as_trait().handle()
}
#[inline]
fn bindings(&self) -> &dyn PdfiumLibraryBindings {
self.unwrap_as_trait().bindings()
}
}
impl<'a> From<PdfActionLocalDestination<'a>> for PdfAction<'a> {
#[inline]
fn from(action: PdfActionLocalDestination<'a>) -> Self {
Self::LocalDestination(action)
}
}
impl<'a> From<PdfActionRemoteDestination<'a>> for PdfAction<'a> {
#[inline]
fn from(action: PdfActionRemoteDestination<'a>) -> Self {
Self::RemoteDestination(action)
}
}
impl<'a> From<PdfActionEmbeddedDestination<'a>> for PdfAction<'a> {
#[inline]
fn from(action: PdfActionEmbeddedDestination<'a>) -> Self {
Self::EmbeddedDestination(action)
}
}
impl<'a> From<PdfActionLaunch<'a>> for PdfAction<'a> {
#[inline]
fn from(action: PdfActionLaunch<'a>) -> Self {
Self::Launch(action)
}
}
impl<'a> From<PdfActionUri<'a>> for PdfAction<'a> {
#[inline]
fn from(action: PdfActionUri<'a>) -> Self {
Self::Uri(action)
}
}
impl<'a> From<PdfActionUnsupported<'a>> for PdfAction<'a> {
#[inline]
fn from(action: PdfActionUnsupported<'a>) -> Self {
Self::Unsupported(action)
}
}