| // Copyright 2014 The Bazel Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.devtools.build.lib.rules.objc; |
| |
| import com.google.common.base.Splitter; |
| import com.google.common.collect.ImmutableBiMap; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableMap; |
| import com.google.common.collect.ImmutableSet; |
| import java.util.EnumSet; |
| import java.util.List; |
| import java.util.Set; |
| |
| /** |
| * Possible values in the {@code TARGETED_DEVICE_FAMILY} build setting. |
| */ |
| public enum TargetDeviceFamily { |
| IPAD, IPHONE, WATCH; |
| |
| /** |
| * An exception that indicates the name of a device family was not recognized or is somehow |
| * invalid. |
| */ |
| public static class InvalidFamilyNameException extends IllegalArgumentException { |
| public InvalidFamilyNameException(String message) { |
| super(message); |
| } |
| } |
| |
| /** |
| * An exception that indicates a family name appeared twice in a sequence when only one is |
| * expected. |
| */ |
| public static class RepeatedFamilyNameException extends IllegalArgumentException { |
| public RepeatedFamilyNameException(String message) { |
| super(message); |
| } |
| } |
| |
| /** |
| * Contains the values of the UIDeviceFamily plist info setting for each valid set of |
| * TargetDeviceFamilies. |
| */ |
| public static final ImmutableMap<Set<TargetDeviceFamily>, List<Integer>> UI_DEVICE_FAMILY_VALUES = |
| ImmutableMap.<Set<TargetDeviceFamily>, List<Integer>>builder() |
| .put(ImmutableSet.of(TargetDeviceFamily.IPHONE), ImmutableList.of(1)) |
| .put(ImmutableSet.of(TargetDeviceFamily.IPAD), ImmutableList.of(2)) |
| .put(ImmutableSet.of(TargetDeviceFamily.WATCH), ImmutableList.of(4)) |
| .put( |
| ImmutableSet.of(TargetDeviceFamily.IPHONE, TargetDeviceFamily.IPAD), |
| ImmutableList.of(1, 2)) |
| .put( |
| ImmutableSet.of(TargetDeviceFamily.IPHONE, TargetDeviceFamily.WATCH), |
| ImmutableList.of(1, 4)) |
| .build(); |
| |
| /** |
| * Returns the name of the family as it appears in build rules. |
| */ |
| public String getNameInRule() { |
| return BY_NAME_IN_RULE.get(this); |
| } |
| |
| private static final ImmutableBiMap<TargetDeviceFamily, String> BY_NAME_IN_RULE = |
| ImmutableBiMap.of(IPAD, "ipad", IPHONE, "iphone", WATCH, "watch"); |
| |
| /** |
| * Converts a sequence containing the strings returned by {@link #getNameInRule()} to a set of |
| * instances of this enum. |
| * |
| * <p>If there are multiple items in the returned set, they are in enumeration order. |
| * |
| * @param names the names of the families |
| * @throws InvalidFamilyNameException if some family name in the sequence was not recognized |
| * @throws RepeatedFamilyNameException if some family name appeared in the sequence twice |
| */ |
| public static Set<TargetDeviceFamily> fromNamesInRule(Iterable<String> names) { |
| Set<TargetDeviceFamily> families = EnumSet.noneOf(TargetDeviceFamily.class); |
| for (String name : names) { |
| TargetDeviceFamily family = BY_NAME_IN_RULE.inverse().get(name); |
| if (family == null) { |
| throw new InvalidFamilyNameException(name); |
| } |
| if (!families.add(family)) { |
| throw new RepeatedFamilyNameException(name); |
| } |
| } |
| return families; |
| } |
| |
| /** |
| * Converts the {@code TARGETED_DEVICE_FAMILY} setting in build settings to a set of |
| * {@code TargetedDevice}s. |
| */ |
| public static Set<TargetDeviceFamily> fromBuildSetting(String targetedDevice) { |
| ImmutableSet.Builder<TargetDeviceFamily> result = ImmutableSet.builder(); |
| for (String numericSetting : Splitter.on(',').split(targetedDevice)) { |
| numericSetting = numericSetting.trim(); |
| switch (numericSetting) { |
| case "1": |
| result.add(IPHONE); |
| break; |
| case "2": |
| result.add(IPAD); |
| break; |
| default: |
| throw new IllegalArgumentException( |
| "Expect comma-separated list containing only '1' and/or '2' for " |
| + "TARGETED_DEVICE_FAMILY: " + targetedDevice); |
| } |
| } |
| return result.build(); |
| } |
| } |