Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions plugins/warp/api/python/warp.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,19 +426,25 @@ def remove_types(self, source: Source, guids: List[TypeGUID]) -> bool:
core_guids[i] = guids[i].uuid
return warpcore.BNWARPContainerRemoveTypes(self.handle, source.uuid, core_guids, count)

def fetch_functions(self, target: WarpTarget, guids: List[FunctionGUID], source_tags: Optional[List[str]] = None):
def fetch_functions(self, target: WarpTarget, guids: List[FunctionGUID], source_tags: Optional[List[str]] = None, constraints: Optional[List[ConstraintGUID]] = None):
count = len(guids)
core_guids = (warpcore.BNWARPFunctionGUID * count)()
for i in range(count):
core_guids[i] = guids[i].uuid
if constraints is None:
constraints = []
constraints_count = len(constraints)
core_constraints = (warpcore.BNWARPConstraintGUID * constraints_count)()
for i in range(constraints_count):
core_constraints[i] = constraints[i].uuid
if source_tags is None:
source_tags = []
source_tags_ptr = (ctypes.c_char_p * len(source_tags))()
source_tags_len = len(source_tags)
for i in range(len(source_tags)):
source_tags_ptr[i] = source_tags[i].encode('utf-8')
source_tags_array_ptr = ctypes.cast(source_tags_ptr, ctypes.POINTER(ctypes.c_char_p))
warpcore.BNWARPContainerFetchFunctions(self.handle, target.handle, source_tags_array_ptr, source_tags_len, core_guids, count)
warpcore.BNWARPContainerFetchFunctions(self.handle, target.handle, source_tags_array_ptr, source_tags_len, core_guids, count, core_constraints, constraints_count)

def get_sources_with_function_guid(self, target: WarpTarget, guid: FunctionGUID) -> List[Source]:
count = ctypes.c_size_t()
Expand Down
9 changes: 7 additions & 2 deletions plugins/warp/api/warp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ bool Container::RemoveTypes(const Source &source, const std::vector<TypeGUID> &g
return result;
}

void Container::FetchFunctions(const Target &target, const std::vector<FunctionGUID> &guids, const std::vector<SourceTag> &tags) const
void Container::FetchFunctions(const Target &target, const std::vector<FunctionGUID> &guids, const std::vector<SourceTag> &tags, const std::vector<ConstraintGUID> &constraints) const
{
size_t count = guids.size();
BNWARPFunctionGUID *apiGuids = new BNWARPFunctionGUID[count];
Expand All @@ -363,9 +363,14 @@ void Container::FetchFunctions(const Target &target, const std::vector<FunctionG
const char** rawTags = new const char*[tagCount];
for (size_t i = 0; i < tagCount; i++)
rawTags[i] = tags[i].c_str();
BNWARPContainerFetchFunctions(m_object, target.m_object, rawTags, tagCount, apiGuids, count);
size_t constraintCount = constraints.size();
BNWARPConstraintGUID *apiConstraints = new BNWARPConstraintGUID[constraintCount];
for (size_t i = 0; i < constraintCount; i++)
apiConstraints[i] = *constraints[i].Raw();
BNWARPContainerFetchFunctions(m_object, target.m_object, rawTags, tagCount, apiGuids, count, apiConstraints, constraintCount);
delete[] apiGuids;
delete[] rawTags;
delete[] apiConstraints;
}

std::vector<Source> Container::GetSourcesWithFunctionGUID(const Target& target, const FunctionGUID &guid) const
Expand Down
2 changes: 1 addition & 1 deletion plugins/warp/api/warp.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ namespace Warp {

bool RemoveTypes(const Source &source, const std::vector<TypeGUID> &guids) const;

void FetchFunctions(const Target &target, const std::vector<FunctionGUID> &guids, const std::vector<SourceTag> &tags = {}) const;
void FetchFunctions(const Target &target, const std::vector<FunctionGUID> &guids, const std::vector<SourceTag> &tags = {}, const std::vector<ConstraintGUID> &constraints = {}) const;

std::vector<Source> GetSourcesWithFunctionGUID(const Target &target, const FunctionGUID &guid) const;

Expand Down
2 changes: 1 addition & 1 deletion plugins/warp/api/warpcore.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ extern "C"
WARP_FFI_API bool BNWARPContainerRemoveFunctions(BNWARPContainer* container, const BNWARPTarget* target, const BNWARPSource* source, BNWARPFunction** functions, size_t count);
WARP_FFI_API bool BNWARPContainerRemoveTypes(BNWARPContainer* container, const BNWARPSource* source, BNWARPTypeGUID* types, size_t count);

WARP_FFI_API void BNWARPContainerFetchFunctions(BNWARPContainer* container, BNWARPTarget* target, const char** sourceTags, size_t sourceTagCount, const BNWARPTypeGUID* guids, size_t count);
WARP_FFI_API void BNWARPContainerFetchFunctions(BNWARPContainer* container, BNWARPTarget* target, const char** sourceTags, size_t sourceTagCount, const BNWARPFunctionGUID* guids, size_t count, const BNWARPConstraintGUID* constraints, size_t constraintCount);

WARP_FFI_API BNWARPSource* BNWARPContainerGetSourcesWithFunctionGUID(BNWARPContainer* container, const BNWARPTarget* target, const BNWARPFunctionGUID* guid, size_t* count);
WARP_FFI_API BNWARPSource* BNWARPContainerGetSourcesWithTypeGUID(BNWARPContainer* container, const BNWARPTypeGUID* guid, size_t* count);
Expand Down
10 changes: 9 additions & 1 deletion plugins/warp/src/container.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use thiserror::Error;
use uuid::Uuid;
use warp::r#type::guid::TypeGUID;
use warp::r#type::{ComputedType, Type};
use warp::signature::constraint::ConstraintGUID;
use warp::signature::function::{Function, FunctionGUID};
use warp::symbol::Symbol;
use warp::target::Target;
Expand Down Expand Up @@ -39,6 +40,8 @@ pub enum ContainerError {
SearchFailed(String),
#[error("failed to commit source '{0}': {1}")]
CommitFailed(SourceId, String),
#[error("container error encountered: {0}")]
Custom(String),
}

/// Represents the ID for a single container source.
Expand Down Expand Up @@ -224,6 +227,7 @@ pub trait Container: Send + Sync + Display + Debug {
/// to verify the permissions of the source.
fn add_source(&mut self, path: SourcePath) -> ContainerResult<SourceId>;

// TODO: Make interior mutable.
/// Flush changes made to a source.
///
/// Because writing to a source can require file or network operations, we let the container
Expand Down Expand Up @@ -292,11 +296,15 @@ pub trait Container: Send + Sync + Display + Debug {
/// Typically, a container that resides only in memory has nothing to fetch, so the default implementation
/// will do nothing. This function is blocking, so assume it will take a few seconds for a container
/// that intends to fetch over the network.
///
/// To constrain on the fetched functions, pass a list of [`ConstraintGUID`]s that will be
/// used to filter the fetched functions which do not contain at least one of the constraints.
fn fetch_functions(
&mut self,
&self,
_target: &Target,
_tags: &[SourceTag],
_functions: &[FunctionGUID],
_constraints: &[ConstraintGUID],
) -> ContainerResult<()> {
Ok(())
}
Expand Down
Loading
Loading