Skip to content

Commit

Permalink
feat: Add check for duplicate name when adding a network. (#221)
Browse files Browse the repository at this point in the history
Resolves an outstanding TODO.
  • Loading branch information
jetuk authored Jul 20, 2024
1 parent d69d26b commit 108882c
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 3 deletions.
2 changes: 2 additions & 0 deletions pywr-core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ pub enum PywrError {
NetworkNotFound(String),
#[error("network index ({0}) not found")]
NetworkIndexNotFound(usize),
#[error("network name `{0}` already exists.")]
NetworkNameAlreadyExists(String),
#[error("parameters do not provide an initial value")]
ParameterNoInitialValue,
#[error("parameter state not found for parameter index {0}")]
Expand Down
25 changes: 22 additions & 3 deletions pywr-core/src/models/multi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,16 +114,20 @@ impl MultiNetworkModel {
.ok_or(PywrError::NetworkNotFound(name.to_string()))
}

pub fn add_network(&mut self, name: &str, network: Network) -> usize {
// TODO check for duplicate names
/// Add a [`Network`] to the model. The name must be unique.
pub fn add_network(&mut self, name: &str, network: Network) -> Result<usize, PywrError> {
if self.get_network_index_by_name(name).is_ok() {
return Err(PywrError::NetworkNameAlreadyExists(name.to_string()));
}

let idx = self.networks.len();
self.networks.push(MultiNetworkEntry {
name: name.to_string(),
network,
parameters: Vec::new(),
});

idx
Ok(idx)
}

/// Add a transfer of data from one network to another.
Expand Down Expand Up @@ -392,4 +396,19 @@ mod tests {

multi_model.step(&mut state).expect("Failed to step multi1-model.")
}

#[test]
fn test_duplicate_network_names() {
let timestepper = default_timestepper();
let scenario_collection = ScenarioGroupCollection::default();

let mut multi_model = MultiNetworkModel::new(ModelDomain::from(timestepper, scenario_collection).unwrap());

let network = Network::default();
let _network1_idx = multi_model.add_network("network1", network);
let network = Network::default();
let result = multi_model.add_network("network1", network);

assert!(result.is_err());
}
}

0 comments on commit 108882c

Please sign in to comment.